| | |
| | | /// modbus tcp 用第三方的包 |
| | | /// </summary> |
| | | public class ModbusHelper { |
| | | // 内存,连接上的 Modbus 通讯对象 |
| | | // 内存,连接上的 Modbus 通讯对象 |
| | | private static Dictionary<string, ModbusClient> _ipPort_ModbusClient = new Dictionary<string, ModbusClient>(); |
| | | |
| | | public ModbusHelper(string ip, int port = 502, byte slaveId = 1) { |
| | |
| | | try { |
| | | if (ip == null || ip.Trim() == "") { |
| | | // 读取配置信息失败 |
| | | LogHelper.Info("Modbus:读取配置信息失败"); |
| | | LogHelper.Info("Modbus:读取配置信息失败"); |
| | | return; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 连接 Modbus 下位机(私有,内部调用) |
| | | /// 连接 Modbus 下位机 (私有,内部调用) |
| | | /// </summary> |
| | | /// <param name="modbusClient"></param> |
| | | private static void Link(ModbusClient modbusClient) { |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读一个或多个线圈,返回一个bit真假数组 |
| | | /// 读一个或多个线圈,返回一个bit真假数组 |
| | | /// </summary> |
| | | /// <param name="address"></param> |
| | | /// <param name="qty"></param> |
| | |
| | | } |
| | | } |
| | | catch (Exception ex) { |
| | | |
| | | LogHelper.InfoEx(ex); |
| | | } |
| | | } |
| | | else { |
| | |
| | | } |
| | | } |
| | | catch (Exception ex) { |
| | | |
| | | LogHelper.InfoEx(ex); |
| | | } |
| | | } |
| | | else { |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 批量读取或单独读取保持寄存器,返回的是32位int数组 |
| | | /// 批量读取或单独读取保持寄存器,返回的是32位int数组 |
| | | /// </summary> |
| | | /// <param name="address">读取起始位</param> |
| | | /// <param name="qty">读取的数量</param> |
| | |
| | | var client = GetModbusClient(ip, port); |
| | | if (client != null && client.Connected) { |
| | | try { |
| | | //一个寄存器是16位,返回2个int类型 |
| | | //一个寄存器是16位,返回2个int类型 |
| | | res = client.ReadHoldingRegisters(address, qty); |
| | | if (res.Length != 0) { |
| | | //读取成功 |
| | |
| | | } |
| | | } |
| | | catch (Exception ex) { |
| | | //如果请求数量超出保持寄存器的最大数据行数,会报错 |
| | | //如果请求数量超出保持寄存器的最大数据行数,会报错 |
| | | LogHelper.Info($"发生了异常:{ex.Message},IP:{ip},Port:{port}", "Error"); |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | catch (Exception ex) { |
| | | |
| | | LogHelper.InfoEx(ex); |
| | | } |
| | | } |
| | | else { |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读一个或多个离散输入,返回一个bit真假数组 |
| | | /// 读一个或多个离散输入,返回一个bit真假数组 |
| | | /// </summary> |
| | | /// <param name="address"></param> |
| | | /// <param name="qty"></param> |
| | |
| | | } |
| | | } |
| | | catch (Exception ex) { |
| | | |
| | | LogHelper.InfoEx(ex); |
| | | } |
| | | } |
| | | else { |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读一个或多个输入寄存器,返回一个int32位数组 |
| | | /// 读一个或多个输入寄存器,返回一个int32位数组 |
| | | /// </summary> |
| | | /// <param name="address"></param> |
| | | /// <param name="qty"></param> |
| | |
| | | } |
| | | } |
| | | catch (Exception ex) { |
| | | |
| | | LogHelper.InfoEx(ex); |
| | | } |
| | | } |
| | | else { |
| | |
| | | } |
| | | |
| | | #region Modbus 协议读写字符串 |
| | | // 将字符串转换为 Modbus 寄存器数组(int[] 形式,每个int存一个16位值) |
| | | // 将字符串转换为 Modbus 寄存器数组 (int[] 形式,每个int存一个16位值) |
| | | private static int[] StringToRegisters(string text) { |
| | | // 填充为偶数长度 |
| | | if (text.Length % 2 != 0) { |
| | |
| | | int[] registers = new int[bytes.Length / 2]; |
| | | |
| | | for (int i = 0; i < registers.Length; i++) { |
| | | // 大端序:高位字节在前 |
| | | // 大端序:高位字节在前 |
| | | registers[i] = (bytes[i * 2] << 8) | bytes[i * 2 + 1]; |
| | | } |
| | | |
| | |
| | | byte[] bytes = new byte[registers.Length * 2]; |
| | | |
| | | for (int i = 0; i < registers.Length; i++) { |
| | | // 提取低16位(忽略高16位) |
| | | // 提取低16位 (忽略高16位) |
| | | ushort registerValue = (ushort)(registers[i] & 0xFFFF); |
| | | |
| | | // 解析大端序 |
| | |
| | | #endregion |
| | | |
| | | /// <summary> |
| | | /// 获取 Modbus 通讯对象(私有,内部调用) |
| | | /// 获取 Modbus 通讯对象 (私有,内部调用) |
| | | /// </summary> |
| | | /// <param name="ip"></param> |
| | | /// <param name="port"></param> |