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
    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<dynamic>(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;
}
}

             b.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<dynamic>(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.功能

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

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

二、本机测试

1.测试前准备

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

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

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地址通过扩展数据传入,端口号就是串口号。

物联网浏览器(IoTBrowser)-Modbus协议集成和测试的更多相关文章

  1. Modbus协议和应用开发介绍

    因业务需要了解Modbus协议的使用,因此对Modbus的协议,以及相应的C#处理应用进行了解,针对协议的几种方式(RTU.ASCII.TCPIP)进行了封装,以及对Modbus的各种功能码的特点进行 ...

  2. 《ServerSuperIO Designer IDE使用教程》-3.Modbus协议,读取多个寄存器,实现多种数据类型解析。发布:v4.2.2版本

    更新内容,v4.2.2版本:1.增加Modbus协议读取多个寄存器,并且按多种数据类型解析数据.2.Modbus Serial和Modbus TCP两个驱动合并成一个驱动.3.修改数据库结构,保存配置 ...

  3. Modbus通信协议的压力测试

    最近物联网都比较的火,因此,特别为各位兄弟姐妹们,奉上一款Mobus协议的测试软件,可以用来做设备的压力测试,和通信测试. 起初软件开发缘由是我们最近在开发一款设备,需要将多个DS18B20并联起来, ...

  4. MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

    最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...

  5. Modbus 协议-Ascii,RTU

    Modbus 协议之 Ascii 下载地址:http://download.csdn.net/detail/woxpp/5043249 1.提供Modbus Ascii 相关发送与接收代码 2.提供M ...

  6. Modbus​协议​深入​讲解_NI

    from:https://www.ni.com/zh-cn/innovations/white-papers/14/the-modbus-protocol-in-depth.html 已​更新 Mar ...

  7. 将jacoco集成到测试工具平台

    最近在做接口测试,想通过代码覆盖率来判断一下接口用例是否缺失,但是每次通过命令来生成覆盖率报告,感觉太麻烦,所以就想着把jacoco集成到测试工具平台中,只需要点几个按钮,就能查看到覆盖率报告. 测试 ...

  8. 基于奇林软件kylinTOP工具的HTTP2协议的压力测试

    1.HTTP协议概述 说到http,那就应该先了解一下http协议的发展历史.关于http协议的历史,可以参考阮一峰老师的这篇博客文章HTTP 协议入门,里面介绍的比较详细了.简单来说http先后存在 ...

  9. Modbus协议及python库实现

    基础知识 硬件层协议:解决0和1的可靠传输,常有RS232.RS485.CAN.IIC.SPI - 软件层协议:解决传输目的,常有Modbus.TCP/IP.CANopen - 协议优点: Modbu ...

  10. modbus协议讲义

        Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现.虽然RTU比较简单,但是看 ...

随机推荐

  1. 10.4K Star!程序员为程序员针对性优化的开源免费笔记

    平时我一直用Notion来记录内容为主,但也一直关注着其他开源产品.上周正好看到一款非常受欢迎的开源免费笔记,今天就推荐给大家:VNote. VNote一个由程序员为程序员打造的开源笔记应用,基于Qt ...

  2. 题解 | CF1328F. Make k Equal (思维,前缀 & 后缀和)

    题目链接:Here 题意:把 \(n\) 个数变成 \(k\) 个相同的数,每次可以把 \(n\) 个数里最大的 \(-1\) 或最小的 \(+1\) ,问最小改变次数 思路: 我们可以枚举,把 \( ...

  3. 2017年第八届 蓝桥杯B组C/C++决赛题目

    部分题目示意图来自网络,所以会带水印 最后编辑时间: 2021年5月12日 统一声明 如果不写默认带有常用头文件 如果不表明主函数默认表示在 void solve(){} 默认使用 using nam ...

  4. NLP复习之神经网络

    NLP复习之神经网络 前言 tips: 设计神经网络时,输入层与输出层节点数往往固定,中间层可以自由指定: 神经网络中的拓扑与箭头代表预测过程数据流向,与训练的数据流有一定区别: 我们不妨重点关注连接 ...

  5. Manjaro Linux永久修改主机名

    技术背景 Linux系统中默认的主机名可以通过hostname指令进行查询,一般默认的是一串的随机字符串: [dechin@dechin-20n2s01200 numba]$ hostname dec ...

  6. 15-TTL与非门

    TTL与非门 集成电路有两大类COMOS和TTL(三极管) 电路结构 工作原理 多发射结的三极管,两个输入之间是与的关系 输入低电平 输入高电平 A.B都是高电平 倒置放大 压差大的先导通 T3,T4 ...

  7. crypto常用算法

    欧几里得算法(辗转相除法) def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) 扩展欧几里得算法 def ext_euclid( ...

  8. JMS微服务开发示例(七)使用 Serilog 作为日志提供者

    nuget 引入: Serilog.Extensions.LoggingSerilog.Settings.ConfigurationSerilog.Sinks.ConsoleSerilog.Sinks ...

  9. [转帖]Nginx惊群效应引起的系统高负载

    https://zhuanlan.zhihu.com/p/401910162 原创:蒋院波 导语:本文从进程状态,进程启动方式,网络io多路复用纬度等方面知识,分享解决系统高负载低利用率的案例 前言: ...

  10. [转帖]金仓数据库KWR使用说明

    金仓数据库KWR使用说明 1.KWR性能报告介绍 2.部署KWR性能报告功能 2.1.修改配置文件 2.2.使配置文件中参数生效 2.3.创建KWR扩展 3.使用KWR快照功能 3.1.创建KWR快照 ...