经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » 浏览器 » 查看文章
物联网浏览器(IoTBrowser)-Modbus协议集成和测试
来源:cnblogs  作者:木子清  时间:2024/2/2 9:11:51  对本文有异议

Modbus协议在应用中一般用来与PLC或者其他硬件设备通讯,Modbus集成到IoTBrowser使用串口插件模式开发,不同的是采用命令函数,具体可以参考前面几篇文章。目前示例实现了Modbus-Rtu和Modbus-Tcp两种,通过js可以与Modbus进行通讯控制。

 

 

 

一、开发插件

    1. 添加引用
      1. 添加NModbus4,在NuGet搜索NModbus4
      2. 添加Core,路径:\IoTBrowser\src\app_x64\Core.dll
      3. 添加Infrastructure,路径:\IoTBrowser\src\app_x64\Infrastructure.dll
      4. 添加Newtonsoft,路径:\IoTBrowser\src\app_x64\Newtonsoft.Json.dll
    2. 开发ModbusRtu和ModbusTcp插件
      1. ModbusRtu

 

  1. public class ModbusRtuCom : ComBase
  2. {
  3. public override string Type => "modbusRtuCom";
  4. public override string Name => "ModbusRtuCom";
  5. private object _locker = new object();
  6. public override bool Init(int port, int baudRate = 9600, string extendData = null)
  7. {
  8. this.Port = port;
  9. var portName = "COM" + port;
  10. base.PortName = portName;
  11. ModbusRtuService.Init(portName, baudRate);
  12. Console.WriteLine("初始化ModbusRtuCom驱动程序成功!");
  13. return true;
  14. }
  15. public override event PushData OnPushData;
  16. public override bool Open()
  17. {
  18. var b = false;
  19. try
  20. {
  21. ModbusRtuService.Open();
  22. b = true;
  23. IsOpen = true;
  24. }
  25. catch (Exception ex)
  26. {
  27. string msg = string.Format("ModbusRtuCom串口打开失败:{0} ", ex.Message);
  28. Console.WriteLine(msg);
  29. }
  30. return b;
  31. }
  32. public override bool Close()
  33. {
  34. ModbusRtuService.Close();
  35. IsOpen = false;
  36. OnPushData = null;
  37. return true;
  38. }
  39. public override string Command(string name, string data)
  40. {
  41. var outData = string.Empty;
  42. var dataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(data);
  43. switch (name)
  44. {
  45. case "ReadCoils":
  46. //01
  47. var readData = ModbusRtuService.ReadCoils(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString()));
  48. outData = ModbusHelper.ToString(readData);
  49. break;
  50. case "ReadInputs":
  51. //02
  52. readData = ModbusRtuService.ReadInputs(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString()));
  53. outData = ModbusHelper.ToString(readData);
  54. break;
  55. case "ReadHoldingRegisters":
  56. //03
  57. readData = ModbusRtuService.ReadHoldingRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString()));
  58. outData = ModbusHelper.ToString(readData);
  59. break;
  60. case "ReadInputRegisters":
  61. //04
  62. readData = ModbusRtuService.ReadInputRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString()));
  63. outData = ModbusHelper.ToString(readData);
  64. break;
  65. case "WriteSingleCoil":
  66. //05
  67. ModbusRtuService.WriteSingleCoil(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ModbusHelper.BoolParse(dataObj.value.ToString()));
  68. break;
  69. case "WriteSingleRegister":
  70. //06
  71. ModbusRtuService.WriteSingleRegister(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.value.ToString()));
  72. break;
  73. case "WriteMultipleCoils":
  74. //0F 写一组线圈
  75. var values = dataObj.value.ToString().Split(' ');
  76. var datas = new bool[values.Length];
  77. for (var i = 0; i < values.Length; i++)
  78. {
  79. datas[i] = ModbusHelper.BoolParse(values[i]);
  80. }
  81. ModbusRtuService.WriteMultipleCoils(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), datas);
  82. break;
  83. case "WriteMultipleRegisters":
  84. // 10 写一组保持寄存器
  85. values = dataObj.value.ToString().Split(' ');
  86. var udatas = new ushort[values.Length];
  87. for (var i = 0; i < values.Length; i++)
  88. {
  89. udatas[i] = ushort.Parse(values[i]);
  90. }
  91. ModbusRtuService.WriteMultipleRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), udatas);
  92. break;
  93. }
  94. return outData;
  95. }
  96. }

 

 

 

??????       b.ModbusTcp

 

  1. public class ModbusTcpCom : ComBase
  2. {
  3. public override string Type => "modbusTcpCom";
  4. public override string Name => "ModbusTcpCom";
  5. private object _locker = new object();
  6. public override bool Init(int port, int baudRate = 9600, string extendData = null)
  7. {
  8. this.Port = port;
  9. ModbusTcpService.Init(extendData, port);
  10. Console.WriteLine("初始化ModbusTcpCom驱动程序成功!");
  11. return true;
  12. }
  13. public override event PushData OnPushData;
  14. public override bool Open()
  15. {
  16. var b = false;
  17. try
  18. {
  19. ModbusTcpService.Open();
  20. b = true;
  21. IsOpen = true;
  22. }
  23. catch (Exception ex)
  24. {
  25. string msg = string.Format("ModbusTcpCom串口打开失败:{0} ", ex.Message);
  26. Console.WriteLine(msg);
  27. }
  28. return b;
  29. }
  30. public override bool Close()
  31. {
  32. ModbusTcpService.Close();
  33. IsOpen = false;
  34. OnPushData = null;
  35. return true;
  36. }
  37. public override string Command(string name, string data)
  38. {
  39. var outData = string.Empty;
  40. var dataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(data);
  41. switch (name)
  42. {
  43. case "ReadCoils":
  44. //01
  45. var readData = ModbusTcpService.ReadCoils(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString()));
  46. outData = ModbusHelper.ToString(readData);
  47. break;
  48. case "ReadInputs":
  49. //02
  50. readData = ModbusTcpService.ReadInputs(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString()));
  51. outData = ModbusHelper.ToString(readData);
  52. break;
  53. case "ReadHoldingRegisters":
  54. //03
  55. readData = ModbusTcpService.ReadHoldingRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString()));
  56. outData = ModbusHelper.ToString(readData);
  57. break;
  58. case "ReadInputRegisters":
  59. //04
  60. readData=ModbusTcpService.ReadInputRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString()));
  61. outData = ModbusHelper.ToString(readData);
  62. break;
  63. case "WriteSingleCoil":
  64. //05
  65. ModbusTcpService.WriteSingleCoil(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ModbusHelper.BoolParse(dataObj.value.ToString()));
  66. break;
  67. case "WriteSingleRegister":
  68. //06
  69. ModbusTcpService.WriteSingleRegister(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.value.ToString()));
  70. break;
  71. case "WriteMultipleCoils":
  72. //0F 写一组线圈
  73. var values = dataObj.value.ToString().Split(' ');
  74. var datas =new bool[values.Length];
  75. for(var i=0;i< values.Length;i++)
  76. {
  77. datas[i] = ModbusHelper.BoolParse(values[i]);
  78. }
  79. ModbusTcpService.WriteMultipleCoils(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), datas);
  80. break;
  81. case "WriteMultipleRegisters":
  82. // 10 写一组保持寄存器
  83. values = dataObj.value.ToString().Split(' ');
  84. var udatas = new ushort[values.Length];
  85. for (var i = 0; i < values.Length; i++)
  86. {
  87. udatas[i] = ushort.Parse(values[i]);
  88. }
  89. ModbusTcpService.WriteMultipleRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), udatas);
  90. break;
  91. }
  92. return outData;
  93. }
  94. }

 

 

 

????3.功能

        1. 读单个线圈
        2. 读取输入线圈/离散量线圈
        3. 读取保持寄存器
        4. 读取输入寄存器
        5. 写单个线圈
        6. 写单个输入线圈/离散量线圈
        7. 写一组线圈
        8. 写一组保持寄存器

源代码位置:\Plugins\DDS.IoT.Modbus

二、本机测试

1.测试前准备

需要安装虚拟串口和modbusslave,可以在源代码中下载:

https://gitee.com/yizhuqing/IoTBrowser/tree/master/soft

2.串口测试

modbus03modbus04

3.TCP测试

modbus02modbus01

三、部署到IoTBrowser

1.编译

(建议生产环境使用Release模式)

2.拷贝到Plugins文件夹

也可以放到com文件夹。

注意:需要拷贝NModbus4.dll到\IoTBrowser\src\app_x64目录下

四、IoTBrowser集成测试

1.串口测试

modbus05

写入多个数据写入以空格分割,写入线圈数据支持0/1或false/true。

modbus06

2.TCP测试

modbus07

TCP注意ip地址通过扩展数据传入,端口号就是串口号。

原文链接:https://www.cnblogs.com/yizhuqing/p/17997593

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号