网关卡通讯函数(Modbus)
- 格式:doc
- 大小:36.50 KB
- 文档页数:5
产品简介LM Gateway202-M数据采集网关,基于稳固的硬件平台设计,完善的软件内核。
提供4个RS-485串口,1个10/100 Mbps以太网口。
网关内嵌Modbus,BACnet,DLT645,PPI,Mbus等数据采集驱动,提供私有协议驱动集成,网关作为Modbus RTU,Modbus TCP服务器对外提供数据硬件规格LM Gateway202硬件参数:CPU ARM926EJ,主频为300MHz内存64MByte 高性能内存Nand Flash 128MByte SLC Flash串口4个全隔离RS485接口网口1个100M/10M以太网接口WIFI 可选配USB无线网卡电源DC9V~36V,支持防反接,抗雷,过流等保护整机重量210g外壳防护等级IP51安装尺寸144mm×100mm×35mm(L×W×H) 含挂耳机械安装DIN导轨卡槽固定LM Gateway202环境参数:功耗主板最大功耗≤3W工作温度工作相对湿度-40~80℃20~90%无凝露接口定义1.POWER电源座信号说明V+ 电源正V- 电源负E 安全地线2. DC座,5.5*2.1mm在电源质量不佳的环境下,建议使用开关电源供电,能有效提高网关抗干扰的能力。
3.网口10/100M高速自适应网卡;采用双级防雷防静电保护,能抵抗2KV雷击;唯一MAC地址。
LAN口默认IP 子网掩码Eth0 192.168.1.233 255.255.255.04.CON功能座PIN号信号说明1 COM1-A RS485-1 信号正端2 COM1-B RS485-1 信号负端3 COM1-GND 信号地4 COM1-TX RS232-1信号发送端5 COM1-RX RS232-1信号接收端6 COM2-A RS485-2 信号正端7 COM2-B RS485-2 信号负端8 COM2-GND 信号地9 COM2-TX RS232-2信号发送端10 COM2-RX RS232-2信号接收端11 COM3-A RS485-3 信号正端12 COM3-B RS485-3 信号负端13 COM3-GND 信号地14 COM3-TX RS232-3信号发送端15 COM3-RX RS232-3信号接收端16 COM4-A RS485-4信号正端17 COM4-B RS485-4 信号负端18 COM4-GND 信号地19 COM4-TX RS232-4信号发送端20 COM4-RX RS232-4信号接收端RS485:全隔离RS485接口,采用三级防护;支持GB/T 17626.5-2008标准中10/700uS测试的最高等级4KV防护;±15kV 人体放电模式;±15kV IEC1000-4-2 气隙放电;通讯参数可配置,默认通讯参数:9600,8-1-N。
首先在NuGet引用EasyModbusTCP安装包代码编写://窗体加载,设置listview列的宽度public void Form1_Load1(object sender, EventArgs e){this.lst_Recv.Columns[1].Width = this.lst_Recv.ClientSize.Width - this.lst_Recv.Columns[0].Width;}public string jsss;public string jsll;public string zsss;public string zsll;bool status;//ModbusClient 实例化ModbusClient mc1 = new ModbusClient("192.168.1.195", 502);ModbusClient mc2 = new ModbusClient("192.168.1.196", 502);//启动通讯按钮事件,开启线程public void btn_qd_Click(object sender, EventArgs e){Thread th = new Thread(new ThreadStart(Roll));th.IsBackground = true;th.Start();this.timer1.Start();}private void Roll(){try{mc1.Connect();mc2.Connect();if (mc1.Connected && mc2.Connected){status = true;AddLog("流量计已成功连接!");}}catch (Exception){status = false;AddLog("流量计通讯断开!");mc1.Disconnect();mc2.Disconnect();mc1.ConnectionTimeout = 5000;mc2.ConnectionTimeout = 5000;mc1.NumberOfRetries = 3;mc2.NumberOfRetries = 3;}//循环读取数据if (status){try{while (true){//原水流量计int[] data1 = mc1.ReadHoldingRegisters(256, 4); tb1_jsss.Text = data1[0].ToString();byte[] c1 = BitConverter.GetBytes(data1[3]);//字节数组高低转换int a1 = c1[0] * 65535 + data1[2] + 22;tb2_jjlj.Text = a1.ToString();//中水流量计int[] data2 = mc2.ReadHoldingRegisters(512, 4);tb3_zsss.Text = data2[0].ToString();byte[] c2 = BitConverter.GetBytes(data2[3]);//字节数组高低转换int a2 = c2[0] * 65535 + data2[2] + 1;tb4_zsll.Text = a2.ToString();Thread.Sleep(10000);}}catch (Exception){status = false;AddLog("读取失败,通信中断!!");mc1.Disconnect();mc2.Disconnect();}}}// C#现场与2台流量计通过无线网桥同时通信,连接不稳定,总是报"通讯失败"错误,所以在定时器事件中,增加自动重连代码,成功解决。
Libmodbus 是一个用于通过Modbus 协议进行通信的开源库。
它提供了一系列函数来实现Modbus 客户端和服务器的功能。
以下是一些常用的Libmodbus 函数的概述:1. modbus_new:创建一个新的Modbus 上下文对象。
2. modbus_set_slave:设置Modbus 设备的从站地址。
3. modbus_connect:连接到Modbus 服务器。
4. modbus_close:关闭与Modbus 服务器的连接。
5. modbus_free:释放Modbus 上下文对象。
6. modbus_read_registers:读取Modbus 服务器上的寄存器。
7. modbus_write_register:向Modbus 服务器写入单个寄存器的值。
8. modbus_write_registers:向Modbus 服务器写入多个寄存器的值。
9. modbus_read_input_registers:读取Modbus 服务器上的输入寄存器。
10. modbus_report_slave_id:获取Modbus 服务器的从站标识。
11. modbus_set_response_timeout:设置Modbus 从站的响应超时时间。
12. modbus_set_slave:设置要访问的Modbus 服务器的从站地址。
13. modbus_strerror:返回错误码对应的错误消息。
这些函数是Libmodbus 中的一部分,用于在Modbus 通信中实现各种操作,如连接到服务器、读取和写入寄存器等。
您可以根据您的具体需求使用适当的函数来开发和实现Modbus 客户端或服务器应用程序。
每个函数都有相应的参数和返回值,您可以通过查看Libmodbus 的文档和示例来了解每个函数的具体用法和示例代码。
p1字符串类型 p1可为如下八个Modbus 功能码之一"01","02","03","04","05","06","0F","10"p2整数型需要通信的从机地址,1~255p3和p4数据类型不固定当p1="01"时,表示读线圈。
p3=起始地址(0-0xFFFF),p4=个数(1-256)当p1="02"时,表示读离散输入量。
p3=起始地址(0-0xFFFF),p4=个数(1-256)当p1="03"时,表示读保持寄存器。
p3=起始地址(0-0xFFFF),p4=个数(1-100)当p1="04"时,表示读输入寄存器。
p3=起始地址(0-0xFFFF),p4=个数(1-100)当p1="05"时,表示写单个线圈。
p3=起始地址(0-0xFFFF),p4=线圈值(0或1)当p1="06"时,表示写单个寄存器。
p3=起始地址(0-0xFFFF),p4=16位寄存器值 当p1="0F"时,表示写多个线圈。
p3=起始地址(0-0xFFFF),p4=数组,数组中元素的个数等于要写入的线圈个数,0和1代表线圈值 ,注意:元素个数不能超过256个当p1="10"时,表示写多个寄存器。
p3=起始地址(0-0xFFFF),p4=数组,数组中元素的个数等于要写入的寄存器个数,值即是要写入的寄存器的值 ,注意:元素个数不能超过123个r1数组类型返回的数组即为符合modbus 协议格式的hex 数据流数组FlexLua DTU01 Modbus 函数库Modbus 数据转换 r1 = LIB_MbRtuMasterSendTrans(p1~p4)函数描述: 根据p1不同的modbus 功能码以及p1之后的参数,生成符合modbus 协议格式的hex 数据流,并以table 数组形式返回应用示例:--读线圈(设备地址=0x03,起始地址=0x0000,个数=3)LIB_Uart0Send (LIB_MbRtuMasterSendTrans ("01", 0x03, 0x0000, 3))p1字符串类型 p1可为如下八个Modbus 功能码之一"01","02","03","04","05","06","0F","10"p2table 型从机发来的应答数据(需要被解析的数据流数组)r1整数型,表示结果r1大于0表示应答正确,小于等于零表示有问题。
Modbus通信协议详情教程Modbus通信协议是一种用于工业自动化领域的通信协议,它被广泛应用于各种工业控制系统中。
本教程将介绍Modbus通信协议的详细内容,包括其基本原理、通信方式和通信数据格式等方面的知识。
一、Modbus通信协议简介Modbus通信协议是由Modicon(现在是施耐德电气公司的子公司)在1979年开发的,它是一种基于主从架构的协议。
该协议采用简单、通用的方式实现设备之间的数据交换,使得不同厂家的设备之间能够进行有效的通信。
二、Modbus通信架构Modbus通信协议包括两种模式:RTU(Remote Terminal Unit)和ASCII(American Standard Code for Information Interchange)。
RTU模式是常用的模式,它通过串行通信实现数据传输,数据被编码为二进制格式,具有较高的通信速度和可靠性。
ASCII模式则是通过串行通信传输可打印字符编码的文本数据,通信速度较慢,但具有更好的人机界面。
三、Modbus通信方式Modbus通信协议定义了两种通信方式:请求-响应模式和发布-订阅模式。
在请求-响应模式下,主节点向从节点发送请求,从节点接收到请求后进行处理并返回响应。
在发布-订阅模式下,主节点向从节点发送订阅请求,从节点将数据主动发布给主节点。
四、Modbus通信数据格式Modbus通信协议定义了几种常用的数据格式,包括保持寄存器、输入寄存器、线圈和离散输入等。
其中,保持寄存器用于存储设备参数和状态信息,输入寄存器用于读取传感器数据,线圈用于控制设备的开关状态,离散输入用于读取设备的输入状态。
五、Modbus通信应用领域Modbus通信协议广泛应用于各种工业自动化领域,包括工厂自动化、能源管理、楼宇自动化、环境监测等。
通过使用Modbus通信协议,不同厂家的设备可以实现互联互通,提高生产效率和管理水平。
六、Modbus通信安全性由于Modbus通信协议的设计初衷是简单易用,没有考虑通信安全性,因此在实际应用中存在一定的安全风险。
MODBUS库函数使用说明1.void setcomm(int bps,int type)网关卡串行通讯设置函数,无返回值。
参数一:bps,类型int,含义为波特率,可选19200、9600、4800、2400等值。
参数二:type,类型int,含义为通讯方式,可选值为0~4,具体含义如下:0 ——8位方式,无校验;1 ——9位方式,偶校验;2 ——9位方式,奇校验;3 ——9位方式,set校验(第九位始终为1);4 ——9位方式,clr校验(第九位始终为0);例:setcomm(9600,1);设置波特率为9600,9位方式,偶校验。
2.void setdelaytime(int ms)设置延时等待时间函数,无返回值。
一条通讯命令若有返回数据,在此命令下发完之后,要过一会才有返回数据;此函数即设置全局的等待时间,当等待时间已到,却未收到一个字节的返回数据,此命令就会退出等待,返回-1。
参数:ms,类型int,含义为等待时间,单位毫秒。
例:setdelaytime(100);设置延时等待时间为100毫秒。
3.void wait(int ms);设置等待时间函数,无返回值。
在同一段SC语言程序中,可能会连续执行多条通讯命令,在两条命令之间需要等待一段时间。
参数:ms,类型int,含义为等待时间,单位毫秒。
例:wait(50);等待50毫秒。
4.int readcoil(int slave,int addr,int num,unsigned char buf[])读线圈函数,返回一个int值;注:通讯命令的返回值的类型和意义都是一致的,此处作详细说明,后面遇到的通讯命令便不再详述:返回值为0,表示收发正常;返回值为-1,表示通讯失败(未收到一个字节的数据);返回值为1,表示收到数据头不对;返回值为2,表示收到数据CRC校验不对。
返回值为4,表示num超出范围。
参数一:slave,类型int,含义为下位机地址。
参数二:addr,类型int,含义为线圈起始地址。
参数三:num,类型int,含义为线圈数量,num <=1000。
参数四:buf[],类型unsigned char数组的指针(在SC语言中用bool数组的指针代替),含义为读到线圈的状态。
例:bool aa[100];_TAG("return") = readcoil(1,0,100,aa[]);读1号PLC(或其他下位机),0号线圈开始的100个线圈的状态,其状态值存放在事先定义的bool数组中。
5.int forcecoil(int slave,int addr,int num,unsigned char send[]) 写线圈函数,返回一个int值;参数一:slave,类型int,含义为下位机地址。
参数二:addr,类型int,含义为线圈起始地址。
参数三:num,类型int,含义为线圈数量,num <=1000。
参数四:send[],类型unsigned char数组的指针(在SC语言中用bool数组的指针代替),含义为要将线圈写成的状态。
例:int i;bool aa[100];if(_TAG("key")){for(i =0;i<100;i= i+1 ){aa[i] = _TAG("force") ;}_TAG("return") = forcecoil(1,0,100,aa[]);}当自定义位号key为ON时,将1号PLC(或其他下位机)的0号线圈开始的100个线圈的状态,全置为自定义位号force的状态。
6.int readinput(int slave,int addr,int num,unsigned char buf[]) 读输入函数,返回一个int值;参数一:slave,类型int,含义为下位机地址。
参数二:addr,类型int,含义为输入起始地址。
参数三:num,类型int,含义为输入数量,num <=1000。
参数四:buf[],类型unsigned char数组的指针(在SC语言中用bool数组的指针代替),含义为读到输入的状态。
例:bool aa[100];_TAG("return") = readinput(1,0,100,aa[]);读1号PLC(或其他下位机),0号输入开始的100个输入的状态,其状态值存放在事先定义的bool数组中。
7.int forcesinglecoil(int slave,int addr,unsigned char send) 写单个线圈函数,返回一个int值;参数一:slave,类型int,含义为下位机地址。
参数二:addr,类型int,含义为输入起始地址。
参数三:send,类型unsigned char(在SC语言中用bool代替),含义为要将线圈写成的状态。
例:if(_TAG("key")){_TAG("return") = forcecoil(1,0,ON);}当自定义位号key为ON时,将1号PLC(或其他下位机)的0号线圈置为ON。
8.int readinputreg(int slave,int addr,int num,int buf[])读输入寄存器函数,返回一个int值;参数一:slave,类型int,含义为下位机地址。
参数二:addr,类型int,含义为输入寄存器起始地址。
参数三:num,类型int,含义为输入寄存器数量,num <=125。
参数四:buf[],类型int数组的指针,含义为读到输入的状态。
例:int aa[100];_TAG("return") = readinputreg(1,0,100,aa[]);读1号PLC(或其他下位机),0号输入寄存器开始的100个输入寄存器的值,其值存放在事先定义的int数组中。
9.int readholdingreg(int slave,int addr,int num,int buf[])读保持寄存器函数,返回一个int值;参数一:slave,类型int,含义为下位机地址。
参数二:addr,类型int,含义为保持寄存器起始地址。
参数三:num,类型int,含义为保持寄存器数量,num <=125。
参数四:buf[],类型int数组的指针,含义为读到输入的状态。
例:int aa[2];_TAG("return") = readinputreg(1,0,2,aa[]);读1号PLC(或其他下位机),0号保持寄存器开始的2个保持寄存器的值,其值存放在事先定义的int数组中。
10.int presetreg(int slave,int addr,int num,int send[]);写保持寄存器函数,返回一个int值;参数一:slave,类型int,含义为下位机地址。
参数二:addr,类型int,含义为保持寄存器起始地址。
参数三:num,类型int,含义为保持寄存器数量,num <=125。
参数四:send[],类型int数组的指针,含义为要将保持寄存器写成的状态。
例:int aa[2];if(_TAG("key")){aa[0] = _TAG("f0") ;aa[1] = _TAG("f1") ;_TAG("return") = presetreg(1,0,2,aa[]);}当自定义位号key为ON时,将1号PLC(或其他下位机)的0号保持寄存器开始的2个保持寄存器的状态,分别置为自定义位号f0和f1的值。
11.int presetsinglereg(int slave,int addr,int send);写单个保持寄存器函数,返回一个int值;参数一:slave,类型int,含义为下位机地址。
参数二:addr,类型int,含义为保持寄存器起始地址。
参数三:send,类型int,含义为要将保持寄存器写成的状态。
例:int aa;if(_TAG("key")){aa = _TAG("f0") ;_TAG("return") = presetsinglereg(1,0,aa);}当自定义位号key为ON时,将1号PLC(或其他下位机)的0号保持寄存器置为自定义位号f0的值。
12.int readexception(int slave,unsigned char buf[]);读异常状态线圈函数,返回一个int值;参数一:slave,类型int,含义为下位机地址。
参数二:buf[],类型unsigned char数组的指针(在SC语言中用bool数组的指针代替),含义为读到线圈的状态。
例:bool aa[8];_TAG("return") = readexception(1,aa[]);读1号PLC(或其他下位机)的个异常状态线圈的状态,其状态值存放在事先定义的bool数组中。