using CCDCount.DLL.Tools; using CCDCount.MODEL.PlcModel; using System; using System.Linq; namespace CCDCount.DLL { public class PLCManagementClass { private bool isConnect = false; public bool IsConnect { get { return isConnect; } } public ModbusTcpClient modbusTcpClient = new ModbusTcpClient(); public PLCManagementClass(string ipAddress) { //ConnectModbus("127.0.0.1"); ConnectModbus(ipAddress); //ConnectModbus("192.168.1.88"); } public void ConnectModbus(string ipAddress) { if (!modbusTcpClient.Connect(ipAddress)) { FaultLog.RecordErrorMessage($"Modbus通讯连接失败,目标IP:{ipAddress}"); isConnect = false; return; } isConnect = true; } /// /// 归零置为True /// public void ReturnToZeroToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 0, values: true); } /// /// 归零置为False /// public void ReturnToZeroToFalse() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 0, values: false); } /// /// 复位置为True /// public void RepositionToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 1, values: true); } /// /// 复位置为False /// public void RepositionToFalse() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 1, values: false); } /// /// 轴停止置为True /// public void ShaftStopsToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 2, values: true); } /// /// 轴停止置为False /// public void ShaftStopsToFalse() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 2, values: false); } /// /// 正转点动置为True /// public void ForwardRotatingJogToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 3, values: true); } /// /// 正转点动置为False /// public void ForwardRotatingJogToFalse() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 3, values: false); } /// /// 反转点动置为True /// public void ReversalReverseJogToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 4, values: true); } /// /// 反转点动置为False /// public void ReversalReverseJogToFalse() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 4, values: false); } /// /// 速度运行设置为True /// public void SpeedRunToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 5, values: true); } /// /// 速度运行设置为False /// public void SpeedRunToFalse() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 5, values: false); } /// /// 启动设置为True /// public void InitiateToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 6, values: true); } /// /// 启动设置为False /// public void InitiateToFalse() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 6, values: false); } /// /// 停止设置为True /// public void StopToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 7, values: true); } /// /// 停止设置为False /// public void StopToFalse() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 7, values: false); } /// /// 设备运行设置为True /// public void EquipmentOperationToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 8, values: true); } /// /// 设备运行设置为False /// public void EquipmentOperationToFalse() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 8, values: false); } /// /// 写入完成设置为True /// public void WriteDoneToTrue() { modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 11, values: true); } /// /// 读取写入完成 /// /// public bool ReadAllowWrite() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress:12, numRegisters: 1)[0]; } /// /// 读取使能完成 /// /// public bool ReadEnableCompletion() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 14, numRegisters: 1)[0]; } /// /// 读取归零完成 /// /// public bool ReadReturnToZeroCompletion() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 15, numRegisters: 1)[0]; } /// /// 读取停止完成 /// /// public bool ReadStopCompletion() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 16, numRegisters: 1)[0]; } /// /// 读取速度运行中 /// public bool ReadSpeedRunning() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 17, numRegisters: 1)[0]; } /// /// 读取归零中 /// /// public bool ReadReturnToZero() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 18, numRegisters: 1)[0]; } /// /// 读取中转阀开定位完成 /// /// public bool ReadTransferValveOpenCompletion() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 19, numRegisters: 1)[0]; } /// /// 读取中转阀关定位完成 /// public bool ReadTransferValveCloseCompletion() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 20, numRegisters: 1)[0]; } /// /// 读取允许数据交换 /// public bool ReadAllowsDataExchange() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 21, numRegisters: 1)[0]; } /// /// 读取暂停数据交换 /// public bool ReadPauseDataExchange() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 22, numRegisters: 1)[0]; } /// /// 缓存计数延时完成 /// /// public bool ReadCacheCountDelayed() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 23, numRegisters: 1)[0]; } /// /// 读取使能 /// /// public bool ReadEnable() { return modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 24, numRegisters: 1)[0]; } /// /// 读取所有状态(状态操作后十位) /// public PlcStaticModelClass ReadAllState() { PlcStaticModelClass result = null; bool[] Readresult = modbusTcpClient.ReadCoilsRegister(slaveId: 1, startAddress: 14, numRegisters: 11); if (Readresult == null) return null; result = new PlcStaticModelClass() { EnableCompletion = Readresult[0], ReturnToZeroCompletion = Readresult[1], StopCompletion = Readresult[2], SpeedRunning = Readresult[3], ReturnToZero = Readresult[4], TransferValveOpenCompletion = Readresult[5], TransferValveCloseCompletion = Readresult[6], AllowsDataExchange = Readresult[7], PauseDataExchange = Readresult[8], CacheCountDelayed = Readresult[9], Enable = Readresult[10] }; return result; } /// /// 写入速度模式运行速度 /// /// public void WriteSpeedModeRunningSpeed(float Value) { modbusTcpClient.WriteMultipleReals(1, 110, new float[] { Value }, "ABCD"); } /// /// 写入点动速度 /// /// public void WriteJogSpeed(float Value) { modbusTcpClient.WriteMultipleReals(1, 114, new float[] { Value }, "ABCD"); } /// /// 写入罐装设定值 /// /// public void WriteBottValueSet(UInt16 Value) { modbusTcpClient.WriteSingleRegister(1, 118, Value); } /// /// 写入中转阀打开速度 /// /// public void WriteTransferValveOpeningSpeed(float Value) { modbusTcpClient.WriteMultipleReals(1, 122, new float[] { Value }, "ABCD"); } /// /// 写入中转阀打开时间 /// public void WriteTransferValveOpeningTime(UInt32 Value) { modbusTcpClient.WriteSingleInt32(1, 126, Value); } /// /// 写入罐装减速值 /// /// public void WriteBottingDecelerationValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 130, Value); } /// /// 写入缓存减速值 /// /// public void WriteCacheDecelerationValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 134, Value); } /// /// 写入缓存计时延时时间 /// /// public void WriteCacheCountDelayTiming(UInt32 Value) { modbusTcpClient.WriteSingleInt32(1, 138, Value); } /// /// 写入缓存停机值 /// /// public void WriteCacheShutdownValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 142, Value); } /// /// 写入罐装料筒震台高速值 /// /// public void WriteBottingMaterialCylinderVibrationTableHighSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 146, Value); } /// /// 写入罐装过滤震台高速值 /// /// public void WriteBottingFilterVibrationTableHighSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 150, Value); } /// /// 写入罐装计数震台高速值 /// /// public void WriteBottingCountVibrationTableHighSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 154, Value); } /// /// 写入罐装料筒震台减速值 /// /// public void WriteBottingMaterialCylinderVibrationTableDecelerationSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 158, Value); } /// /// 写入罐装过滤震台减速值 /// /// public void WriteBottingFilterVibrationTableDecelerationSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 162, Value); } /// /// 写入罐装计数震台减速值 /// /// public void WriteBottingCountVibrationTableDecelerationSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 166, Value); } /// /// 写入缓存料筒震台高速值 /// /// public void WriteCacheMaterialCylinderVibrationTableHighSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 170, Value); } /// /// 写入缓存过滤震台高速值 /// /// public void WriteCacheFilterVibrationTableHighSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 174, Value); } /// /// 写入缓存计数震台高速值 /// /// public void WriteCacheCountVibrationTableHighSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 178, Value); } /// /// 写入缓存料筒震台减速值 /// /// public void WriteCacheMaterialCylinderVibrationTableDecelerationSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 182, Value); } /// /// 写入缓存过滤震台减速值 /// /// public void WriteCacheFilterVibrationTableDecelerationSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 186, Value); } /// /// 写入缓存计数震台减速值 /// /// public void WriteCacheCountVibrationTableDecelerationSpeedValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 190, Value); } /// /// 写入闸门打开延时 /// /// public void WriteGateOpeningDelay(UInt32 Value) { modbusTcpClient.WriteSingleInt32(1, 194, Value); } /// /// 写入回零偏移值 /// /// public void WriteReturnToZeroOffsetValue(float Value) { modbusTcpClient.WriteSingleReal(1, 198, Value); } /// /// 写入回零偏移速度 /// /// public void WriteReturnToZeroOffsetSpeed(float Value) { modbusTcpClient.WriteSingleReal(1, 202, Value); } /// /// 写入中转阀关闭速度 /// /// public void WriteTransferValveClosingSpeed(float Value) { modbusTcpClient.WriteSingleReal(1, 206, Value); } /// /// 写入中转阀开位置 /// /// public void WriteTransferValveOpenPosition(float Value) { modbusTcpClient.WriteSingleReal(1, 210, Value); } /// /// 写入中转阀关位置 /// /// public void WriteTransferValveClosePosition(float Value) { modbusTcpClient.WriteSingleReal(1, 214, Value); } /// /// 写入空气阀开启延时 /// public void WriteAirValveOpeningDelay(UInt32 Value) { modbusTcpClient.WriteSingleInt32(1, 218, Value); } /// /// 写入罐装停机值 /// /// public void WriteBottlingShutdownValue(ushort Value) { modbusTcpClient.WriteSingleRegister(1, 230, Value); } /// /// 写入罐装停机时间 /// /// public void WriteBottlingShutdownTime(UInt32 Value) { modbusTcpClient.WriteSingleInt32(1, 234, Value); } /// /// 读取所有参数(参数数据表) /// public PlcParaModelClass ReadAllPara() { PlcParaModelClass result = null; var results = modbusTcpClient.ReadHoldingRegisters(slaveId: 1, startAddress: 110, numRegisters: 124); if (results == null) return null; result = new PlcParaModelClass() { SpeedModeRunningSpeed = GetFloatFromRegisters(results.Take(2).ToArray()), JogSpeed = GetFloatFromRegisters(results.Skip(4).Take(2).ToArray()), BottValueSet = results[8], TransferValveOpeningSpeed = GetFloatFromRegisters(results.Skip(12).Take(2).ToArray()), TransferValveOpeningTime = GetInt32FromRegisters(results.Skip(16).Take(2).ToArray()), BottingDecelerationValue = results[20], CacheDecelerationValue = results[24], CacheCountDelayTiming = GetInt32FromRegisters(results.Skip(28).Take(2).ToArray()), CacheShutdownValue = results[32], BottingMaterialCylinderVibrationTableHighSpeedValue = results[36], BottingFilterVibrationTableHighSpeedValue = results[40], BottingCountVibrationTableHighSpeedValue = results[44], BottingMaterialCylinderVibrationTableDecelerationSpeedValue = results[48], BottingFilterVibrationTableDecelerationSpeedValue = results[52], BottingCountVibrationTableDecelerationSpeedValue = results[56], CacheMaterialCylinderVibrationTableHighSpeedValue = results[60], CacheFilterVibrationTableHighSpeedValue = results[64], CacheCountVibrationTableHighSpeedValue = results[68], CacheMaterialCylinderVibrationTableDecelerationSpeedValue = results[72], CacheFilterVibrationTableDecelerationSpeedValue = results[76], CacheCountVibrationTableDecelerationSpeedValue = results[80], GateOpeningDelay = GetInt32FromRegisters(results.Skip(84).Take(2).ToArray()), ReturnToZeroOffsetValue = GetFloatFromRegisters(results.Skip(88).Take(2).ToArray()), ReturnToZeroOffsetSpeed = GetFloatFromRegisters(results.Skip(92).Take(2).ToArray()), TransferValveClosingSpeed = GetFloatFromRegisters(results.Skip(96).Take(2).ToArray()), TransferValveOpenPosition = GetFloatFromRegisters(results.Skip(100).Take(2).ToArray()), TransferValveClosePosition = GetFloatFromRegisters(results.Skip(104).Take(2).ToArray()), AirValveOpeningDelay = GetInt32FromRegisters(results.Skip(108).Take(2).ToArray()), BottlingShutdownValue = results[120], BottlingShutdownTime = modbusTcpClient.ReadHoldingRegistersAsInt32(slaveId: 1, startAddress: 234, count: 1)[0], }; return result; } /// /// 获取16位寄存器中的32Uint位值 /// private UInt32 GetInt32FromRegisters(ushort[] registers) { ushort highRegister = registers[0]; ushort lowRegister = registers[1]; // 根据字节序组合成32位值 byte[] bytes = new byte[4]; if (BitConverter.IsLittleEndian) { bytes[3] = (byte)((highRegister >> 8) & 0xFF); bytes[2] = (byte)(highRegister & 0xFF); bytes[1] = (byte)((lowRegister >> 8) & 0xFF); bytes[0] = (byte)(lowRegister & 0xFF); } else { bytes[0] = (byte)((highRegister >> 8) & 0xFF); bytes[1] = (byte)(highRegister & 0xFF); bytes[2] = (byte)((lowRegister >> 8) & 0xFF); bytes[3] = (byte)(lowRegister & 0xFF); } // 转换为float return (UInt32)BitConverter.ToInt32(bytes, 0); } /// /// 获取16位寄存器中的32Float位值 /// private float GetFloatFromRegisters(ushort[] registers) { string byteOrder = "ABCD"; ushort highRegister = registers[0]; ushort lowRegister = registers[1]; byte[] bytes = ConvertToByteArray(lowRegister, highRegister, byteOrder); return BitConverter.ToSingle(bytes, 0); ; } /// /// 将寄存器数组换为字节数组转(根据指定字节序) /// /// 低位寄存器 /// 高位寄存器 /// 字节序 /// 字节数组 private byte[] ConvertToByteArray(ushort lowRegister, ushort highRegister, string byteOrder) { byte[] bytes = new byte[4]; switch (byteOrder.ToUpper()) { case "ABCD": // 大端序 bytes[0] = (byte)(highRegister >> 8); bytes[1] = (byte)(highRegister & 0xFF); bytes[2] = (byte)(lowRegister >> 8); bytes[3] = (byte)(lowRegister & 0xFF); break; case "CDAB": // 小端序 bytes[0] = (byte)(lowRegister >> 8); bytes[1] = (byte)(lowRegister & 0xFF); bytes[2] = (byte)(highRegister >> 8); bytes[3] = (byte)(highRegister & 0xFF); break; case "BADC": bytes[0] = (byte)(highRegister & 0xFF); bytes[1] = (byte)(highRegister >> 8); bytes[2] = (byte)(lowRegister & 0xFF); bytes[3] = (byte)(lowRegister >> 8); break; case "DCBA": bytes[0] = (byte)(lowRegister & 0xFF); bytes[1] = (byte)(lowRegister >> 8); bytes[2] = (byte)(highRegister & 0xFF); bytes[3] = (byte)(highRegister >> 8); break; default: // 默认使用ABCD顺序 bytes[0] = (byte)(highRegister >> 8); bytes[1] = (byte)(highRegister & 0xFF); bytes[2] = (byte)(lowRegister >> 8); bytes[3] = (byte)(lowRegister & 0xFF); break; } return bytes; } /// /// 切换使能 /// public void SwitchEnable() { bool Enable = ReadEnable(); modbusTcpClient.WriteCoilsRegister(slaveId: 1, CoilsAddress: 24, values: !Enable); } } }