首页 > 其他分享 >物联网浏览器(IoTBrowser)-Modbus协议集成和测试

物联网浏览器(IoTBrowser)-Modbus协议集成和测试

时间:2024-01-31 09:46:32浏览次数:27  
标签:Parse 浏览器 string dataObj IoTBrowser ushort Modbus ToString var

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.串口测试

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

标签:Parse,浏览器,string,dataObj,IoTBrowser,ushort,Modbus,ToString,var
From: https://www.cnblogs.com/yizhuqing/p/17997593

相关文章

  • anaconda+jupyter书写python简简简简简易安装教程,浏览器编写执行Python程序
    anaconda+jupyter书写python简简简简简易安装教程,浏览器编写执行Python程序目录 1、安装anaconda2、打开JupyterNotebook3、创立ipynb文件编写python代码 4、导出python文件(.py)1、安装anaconda下载地址:www.anaconda.com点击Download会下载一个大约600M的安装包,......
  • axios实现,在一个极短时间内,请求同一个接口,若传参完全一样,则使用浏览器中的缓存中的上
    axios实现,在一个极短时间内,请求同一个接口,若传参完全一样,则使用浏览器中的缓存中的上次的值。同时,上次的值应该在指定时间内可以自动清除。请写一个axios适配器。实现上述功能。在axios中,我们可以利用浏览器的缓存机制(HTTP缓存)来实现这个需求。不过,浏览器的HTTP缓存主要依赖于服......
  • 浏览器存储 LocalForage
    浏览器存储LocalForagecookie、session、LocalStorage存在一定的缺点存储量小存值和取值需要经过序列化和反序列化虽然IndexedDB可以用数据库这种形式来玩转本地化存储,然而它的使用比较复杂LocalForage,就相当于轻松的使用IndexedDB,它们俩都是异步的异步,即存储大文件的时......
  • 解决Edge浏览器提示“此网站已被人举报不安全”
    今天下午微软旗下的MicrosoftEdge浏览器将百度搜索的跳转域名(*.baidu.com/link?url=*)封杀,百度搜索首页可以打开,但搜索任何关键词点击搜索结果都会被拦截。当用户访问时MicrosoftEdge弹出以下提示:此网站已经被人举报不安全托管方www.baidu.comMicrosoft建议你不要......
  • 物联网浏览器(IoTBrowser)-电子秤模块及二次驱动开发
    本章介绍电子秤模块的示例功能以及二次开发称重驱动的代码,二次开发以顶尖OS2型号驱动为示例,实现方式与物联网浏览器(IoTBrowser)-顶尖OS2电子秤协议实现类似,不同的是电子秤只需要采集重量不需要写入串口数据,实现一个称重抽象类即可。一、电子秤示例功能示例代码文件:\src\app_x64......
  • JavaScript 实现浏览器级别的弹窗提示
    可放在网页任何位置,以下是代码:1.每次打开都会弹出提示<script>//在页面加载时触发警告框window.onload=function(){alert('这是浏览器级别的弹窗提示!');};</script> 2.打开只弹出一次,刷新网页不会弹出,清理浏览器缓存会再次弹出<script>/......
  • C#-Modbus-RTU
    Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气SchneiderElectric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(Defacto),并且现在是工业电子设备之间常用的连接方式。对于串行连接,存在两个变种,它们在数值数据表示......
  • 完美解决 - 前端发版后浏览器缓存问题
    一、简介开发完发布新版本后,在有些电脑上总需要强刷才能获取到最新版本的内容,太恶心了。浏览器缓存(BrowserCaching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面......
  • Google浏览器Provisional headers are shown. Disable cache to see full headers.
    Google浏览器Provisionalheadersareshown.Disablecachetoseefullheaders.问题解决方法勾选禁用缓存,刷新成功......
  • modbus和tcp有什么区别?
    Modbus和TCP都是网络通信协议,但它们有着不同的特点和用途。Modbus是一种串行通信协议,最初是为了在PLC(可编程逻辑控制器)之间进行通信而设计的。它采用RS-485或RS-232等串行通信接口,数据传输速率通常较慢,但距离较短。Modbus协议使得控制器之间以及控制器与网络和其它设备之间能够进行......