New file |
| | |
| | | using IoTClient; |
| | | using IoTClient.Clients.Modbus; |
| | | using IoTClient.Common.Enums; |
| | | using IoTClient.Enums; |
| | | using IoTClient.Models; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace WCS.Application; |
| | | /// <summary> |
| | | /// Modbus |
| | | /// </summary> |
| | | public class ModbusUtil |
| | | { |
| | | public readonly long PlcId; |
| | | public readonly string PlcIP; |
| | | private ModbusTcpClient _client; |
| | | private WcsPlc _modPlc; |
| | | private readonly object OLock = new object(); |
| | | public ModbusUtil(WcsPlc modPlc) |
| | | { |
| | | //测试代码 |
| | | //WCS.Application.ModbusUtil modUtil = new WCS.Application.ModbusUtil(new WCS.Application.WcsPlc() { IP = "127.0.0.1", Port = 502 }); |
| | | //var result = modUtil.GetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4"); |
| | | //Console.WriteLine(result.value); |
| | | //var result2 = modUtil.SetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4", "44"); |
| | | //Console.WriteLine(result2.IsSucceed); |
| | | |
| | | PlcId = modPlc.Id; |
| | | PlcIP = modPlc.IP; |
| | | _modPlc = modPlc; |
| | | _client = new ModbusTcpClient(modPlc.IP, modPlc.Port); |
| | | _client.Open(); |
| | | } |
| | | |
| | | public bool Connected |
| | | { |
| | | get { return _client.Connected; } |
| | | } |
| | | public IoTClient.Result Open() |
| | | { |
| | | return _client.Open(); |
| | | } |
| | | public IoTClient.Result Close() |
| | | { |
| | | return _client.Close(); |
| | | } |
| | | /// <summary> |
| | | /// 读取PLC值 |
| | | /// </summary> |
| | | /// <param name="PosType">字符类型</param> |
| | | /// <param name="Pos">偏移量/地址</param> |
| | | /// <param name="StationNumber">站号</param> |
| | | /// <returns></returns> |
| | | public (IoTClient.Result, dynamic value) GetDBValue(PLCDataTypeEnum PosType, string Pos, byte StationNumber = 1) |
| | | { |
| | | lock (OLock) |
| | | { |
| | | dynamic result = null; |
| | | switch (PosType) |
| | | { |
| | | case PLCDataTypeEnum.Bit: |
| | | result = _client.ReadCoil(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Byte: |
| | | result = _client.ReadDiscrete(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Short: |
| | | result = _client.ReadInt16(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.UShort: |
| | | result = _client.ReadUInt16(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Int: |
| | | result = _client.ReadInt32(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.UInt: |
| | | result = _client.ReadUInt32(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Long: |
| | | result = _client.ReadInt64(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.ULong: |
| | | result = _client.ReadUInt64(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Float: |
| | | result = _client.ReadFloat(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Double: |
| | | result = _client.ReadDouble(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.String: |
| | | result = _client.ReadString(Pos, StationNumber); |
| | | break; |
| | | default: |
| | | result = new IoTClient.Result<object>(); |
| | | break; |
| | | } |
| | | return (result, result.Value); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 批量读取PLC值 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public Result<List<ModbusOutput>> GetBatchDBValue(Dictionary<string, PLCDataTypeEnum> listaddress) |
| | | { |
| | | lock (OLock) |
| | | { |
| | | var list = new List<ModbusInput>(); |
| | | foreach (var address in listaddress) |
| | | { |
| | | switch (address.Value) |
| | | { |
| | | case PLCDataTypeEnum.Bit: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Bool, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Byte: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Byte, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Short: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Int16, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.UShort: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.UInt16, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Int: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Int32, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.UInt: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.UInt32, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Long: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Int64, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.ULong: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.UInt64, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Float: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Float, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Double: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Double, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.String: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.String, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | return _client.BatchRead(list); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 写入PLC值 |
| | | /// </summary> |
| | | /// <param name="PosType">字符类型</param> |
| | | /// <param name="Pos">偏移量/地址</param> |
| | | /// <param name="Value">写入值</param> |
| | | /// <param name="StationNumber">站号</param> |
| | | /// <returns></returns> |
| | | public IoTClient.Result SetDBValue(PLCDataTypeEnum PosType, string Pos, string Value, byte StationNumber = 1) |
| | | { |
| | | switch (PosType) |
| | | { |
| | | case PLCDataTypeEnum.Bit: |
| | | if (!bool.TryParse(Value, out bool bit)) |
| | | { |
| | | if (Value == "0") |
| | | bit = false; |
| | | else if (Value == "1") |
| | | bit = true; |
| | | else |
| | | { |
| | | throw new Exception("写入值错误"); |
| | | } |
| | | } |
| | | return _client.Write(Pos, bit, StationNumber); |
| | | case PLCDataTypeEnum.Byte: |
| | | return _client.Write(Pos, byte.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Short: |
| | | return _client.Write(Pos, short.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.UShort: |
| | | return _client.Write(Pos, ushort.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Int: |
| | | return _client.Write(Pos, int.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.UInt: |
| | | return _client.Write(Pos, uint.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Long: |
| | | return _client.Write(Pos, long.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.ULong: |
| | | return _client.Write(Pos, ulong.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Float: |
| | | return _client.Write(Pos, float.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Double: |
| | | return _client.Write(Pos, float.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.String: |
| | | return _client.Write(Pos, Value, StationNumber); |
| | | default: |
| | | return new IoTClient.Result(); |
| | | } |
| | | } |
| | | } |