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);
}
}
}