Modbus协议在应用中一般用来与PLC或者其他硬件设备通讯,Modbus集成到IoTBrowser使用串口插件模式开发,不同的是采用命令函数,具体可以参考前面几篇文章。目前示例实现了Modbus-Rtu和Modbus-Tcp两种,通过js可以与Modbus进行通讯控制。
一、开发插件
-
添加引用
-
添加NModbus4,在NuGet搜索NModbus4
-
添加Core,路径:\IoTBrowser\src\app_x64\Core.dll
-
添加Infrastructure,路径:\IoTBrowser\src\app_x64\Infrastructure.dll
-
添加Newtonsoft,路径:\IoTBrowser\src\app_x64\Newtonsoft.Json.dll
-
开发ModbusRtu和ModbusTcp插件
-
ModbusRtu
public class ModbusRtuCom : ComBase { public override string Type => "modbusRtuCom"; public override string Name => "ModbusRtuCom"; private object _locker = new object(); public override bool Init(int port, int baudRate = 9600, string extendData = null) { this.Port = port; var portName = "COM" + port; base.PortName = portName; ModbusRtuService.Init(portName, baudRate); Console.WriteLine("初始化ModbusRtuCom驱动程序成功!"); return true; } public override event PushData OnPushData; public override bool Open() { var b = false; try { ModbusRtuService.Open(); b = true; IsOpen = true; } catch (Exception ex) { string msg = string.Format("ModbusRtuCom串口打开失败:{0} ", ex.Message); Console.WriteLine(msg); } return b; } public override bool Close() { ModbusRtuService.Close(); IsOpen = false; OnPushData = null; return true; } public override string Command(string name, string data) { var outData = string.Empty; var dataObj = Newtonsoft.Json.JsonConvert.DeserializeObject
(data); switch (name) { case "ReadCoils": //01 var readData = ModbusRtuService.ReadCoils(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString())); outData = ModbusHelper.ToString(readData); break; case "ReadInputs": //02 readData = ModbusRtuService.ReadInputs(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString())); outData = ModbusHelper.ToString(readData); break; case "ReadHoldingRegisters": //03 readData = ModbusRtuService.ReadHoldingRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString())); outData = ModbusHelper.ToString(readData); break; case "ReadInputRegisters": //04 readData = ModbusRtuService.ReadInputRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString())); outData = ModbusHelper.ToString(readData); break; case "WriteSingleCoil": //05 ModbusRtuService.WriteSingleCoil(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ModbusHelper.BoolParse(dataObj.value.ToString())); break; case "WriteSingleRegister": //06 ModbusRtuService.WriteSingleRegister(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.value.ToString())); break; case "WriteMultipleCoils": //0F 写一组线圈 var values = dataObj.value.ToString().Split(' '); var datas = new bool[values.Length]; for (var i = 0; i < values.Length; i++) { datas[i] = ModbusHelper.BoolParse(values[i]); } ModbusRtuService.WriteMultipleCoils(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), datas); break; case "WriteMultipleRegisters": // 10 写一组保持寄存器 values = dataObj.value.ToString().Split(' '); var udatas = new ushort[values.Length]; for (var i = 0; i < values.Length; i++) { udatas[i] = ushort.Parse(values[i]); } ModbusRtuService.WriteMultipleRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), udatas); break; } return outData; } } -
ModbusTcp
public class ModbusTcpCom : ComBase { public override string Type => "modbusTcpCom"; public override string Name => "ModbusTcpCom"; private object _locker = new object(); public override bool Init(int port, int baudRate = 9600, string extendData = null) { this.Port = port; ModbusTcpService.Init(extendData, port); Console.WriteLine("初始化ModbusTcpCom驱动程序成功!"); return true; } public override event PushData OnPushData; public override bool Open() { var b = false; try { ModbusTcpService.Open(); b = true; IsOpen = true; } catch (Exception ex) { string msg = string.Format("ModbusTcpCom串口打开失败:{0} ", ex.Message); Console.WriteLine(msg); } return b; } public override bool Close() { ModbusTcpService.Close(); IsOpen = false; OnPushData = null; return true; } public override string Command(string name, string data) { var outData = string.Empty; var dataObj = Newtonsoft.Json.JsonConvert.DeserializeObject
(data); switch (name) { case "ReadCoils": //01 var readData = ModbusTcpService.ReadCoils(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString())); outData = ModbusHelper.ToString(readData); break; case "ReadInputs": //02 readData = ModbusTcpService.ReadInputs(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString())); outData = ModbusHelper.ToString(readData); break; case "ReadHoldingRegisters": //03 readData = ModbusTcpService.ReadHoldingRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString())); outData = ModbusHelper.ToString(readData); break; case "ReadInputRegisters": //04 readData=ModbusTcpService.ReadInputRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.numberOfPoints.ToString())); outData = ModbusHelper.ToString(readData); break; case "WriteSingleCoil": //05 ModbusTcpService.WriteSingleCoil(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ModbusHelper.BoolParse(dataObj.value.ToString())); break; case "WriteSingleRegister": //06 ModbusTcpService.WriteSingleRegister(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), ushort.Parse(dataObj.value.ToString())); break; case "WriteMultipleCoils": //0F 写一组线圈 var values = dataObj.value.ToString().Split(' '); var datas =new bool[values.Length]; for(var i=0;i< values.Length;i++) { datas[i] = ModbusHelper.BoolParse(values[i]); } ModbusTcpService.WriteMultipleCoils(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), datas); break; case "WriteMultipleRegisters": // 10 写一组保持寄存器 values = dataObj.value.ToString().Split(' '); var udatas = new ushort[values.Length]; for (var i = 0; i < values.Length; i++) { udatas[i] = ushort.Parse(values[i]); } ModbusTcpService.WriteMultipleRegisters(byte.Parse(dataObj.slaveAddress.ToString()), ushort.Parse(dataObj.startAddress.ToString()), udatas); break; } return outData; } } 3.功能
-
读单个线圈
读取输入线圈/离散量线圈
读取保持寄存器
读取输入寄存器
写单个线圈
写单个输入线圈/离散量线圈
写一组线圈
写一组保持寄存器
源代码位置:\Plugins\DDS.IoT.Modbus
二、本机测试
1.测试前准备
需要安装虚拟串口和modbusslave,可以在源代码中下载:
物联网浏览器: IoTBrowser用于开发人机界面(HMI)或数据采集与监督控制系统(SCADA) 的工具,使用HTML或Vue前端技术开发物联网终端用户界面,支持串口、RFID、电子秤等硬件协议,支持js控制关机、全屏等工控操作。 - Gitee.com
2.串口测试
3.TCP测试
三、部署到IoTBrowser
1.编译
(建议生产环境使用Release模式)
2.拷贝到Plugins文件夹
也可以放到com文件夹。
注意:需要拷贝NModbus4.dll到\IoTBrowser\src\app_x64目录下
四、IoTBrowser集成测试
1.串口测试
写入多个数据写入以空格分割,写入线圈数据支持0/1或false/true。
2.TCP测试
TCP注意ip地址通过扩展数据传入,端口号就是串口号。
文章转载自:木子清
原文链接:https://www.cnblogs.com/yizhuqing/p/17997593
体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构
-
-
-
猜你喜欢
- 8天前(三亚太阳湾柏悦度假酒店)三亚太阳湾柏悦酒店携手ROSEONLY诺誓缔造浪漫七夕
- 8天前(屿见不一样是哪个酒店)屿见白纱,遇见自己 “佳能PhotoGirls屿见白纱”摄影派对玩转海岛
- 8天前(新西兰“空降”上海:新西兰旅游局邀请你来“玩真的”!)新西兰“空降”上海:新西兰旅游局邀请你来“玩真的”!
- 8天前(“清透会呼吸”轻松拿捏春日出游氛围感)“清透会呼吸”轻松拿捏春日出游氛围感
- 8天前(天津四季酒店开业时间)天津四季酒店邀你开启灿烂暑假
- 8天前(夏日纵享 邂逅双面姑苏是哪一集)夏日纵享 邂逅双面姑苏
- 8天前(万豪旅享家活动2021)精彩上新,漫享夏日----跟随万豪旅享家新开酒店解锁夏日旅行灵感
- 8天前(锦州新增两家国家aaa级旅游景区有哪些)锦州新增两家国家AAA级旅游景区
- 8天前(大黄山景区高质量发展联盟成立多少年)大黄山景区高质量发展联盟成立
- 8天前(锦江 iu)锦江荟APP原生鸿蒙版正式上线打造全场景旅行服务新体验
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章