modbus协议栈(modbus协议栈移植)

      最后更新:2023-04-20 08:36:24 手机定位技术交流文章

      Modbus的报文格式

      Modbus ASCII或RTU模式仅使用于标准的Modbus协议串行网络,它定义了在这些网络上连续传输的消息段的每一个字节,以及决定怎样将信息打包成消息域和如何解码等功能。当控制器设为在Modbus网络上以ASCII模式通信时,在消息中每个8位(bit)的字节都将作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1s而不产生错误。在ASCII模式下,消息以冒号(:)字符(ASCII码0x3A)开始,以回车换行符结束(ASCII码0x0D,0x0A)。消息帧的其他字段可以使用的传输字符是十六进制的09,AF。处于网络上的Modbus设备不断侦测 “:” 字符,当有一个冒号接收到时,每个设备进入解码阶段,并解码下一个字段(地址域)来判断是否是发给自己的。消息帧中的字符间发送的时间间隔最长不能超过1s,否则接收的设备将认为发生传输错误。传输设备将Modbus报文放置在带有已知起始和结束电的消息帧中,这就要求接收消息真的设备在报文的起始处开始接收,并且要知道报文传输何时结束。另外还必须能够检测到不完整的报文,且能够清晰地设置错误标志。在RTU模式中,消息的发送和接收以至少3.5个字符时间的停顿间隔为标志。实际使用中,网络设备不断侦测网络总线,计算字符间的停顿间隔时间,判断消息帧的起始点。当接收到第一个域(地址域)时,每个设备都进行解码以判断时否时发给自己的。在最后一个传输字符结束之后,一个至少3.5个字符时间的停顿标定了消息的结束,而一个新的消息可以在此停顿后开始。另外,在一帧报文中,必须以连续的字符流发送整个报文帧。如果两个字符之间的空闲间隔大于1.5个字符时间,那么认为报文帧不完整,该报文将丢失。简单来说,3.5个字符时间间隔的目的是作为区别前后两帧数据的分隔符。例如:串口参数设置为1位起始位,8位数据位,1位校验位,1位停止位。这样1个字符就博爱阔11位,那么3.5个字符就是3.5*11=38.5位。此时波特率设置位9600bps,即每秒传输数据为9600个位的数据。那么换算一下,38.5个二进制位数据需要的时间就是38.5*(1000/9600)=4.0104167ms。那么在波特率9600bps的情况下,相邻的两帧数据的起始和结束之间至少有≥4.0104167ms的时间间隔。为了时间RTU通信中的时间间隔管理,定时器将引起大量的中断处理,在较高的通信波特率下将导致CPU沉重负担。为此,规定当波特率≤19200bps时,需要严格遵守时间间隔。在波特率>19200bps时,时间间隔使用固定值。地址域即通信帧中的地址字段,内容为从设备地址。Modbus消息帧的地址域包含2个字符(ASCII模式)或者1个字节(RTU模式)。从设备的地址是0~247(十进制),单个设备的实际地址范围是1~247,地址0作为广播地址。主设备发送消息时将从设备地址放到地址域中以便从设备识别此消息是否是发给自己的。从设备回复主设备时会将自己的地址放到回应消息的地址域中以便主设备识别是哪个从设备返回的数据。功能吗用于表示消息帧的功能。功能码域由1个字节构成,取值范围为1~255(十进制)。从设备根据功能码执行相应的功能,执行完成后在响应消息帧中设置同样的功能码。如果出现异常,返回的消息帧中将功能码最高位(MSB)设置为1。数据域存放功能码需要操作的具体数据。数据域以字节为单位,长度可变。在Modbus串行通信中,更具传输模式(ASCII和RTU)的不同,差错校验域采用了不同的校验方式。在Modbus TCP/IP协议中,串行链路中的主/从设备分别演变位客户端/服务器端设备。Modbus协议在TCP/IP上的实现实在TCP/IP协议层上的应用,它需要一个完整的TCP/IP协议栈作为支撑,Modbus TCP/IP服务器端通常使用端口502作为接收报文的端口。为了便于传输或者提取各报文,保证报文传输的完整性,Modbus协议在应用数据单元(ADU)中引入了附加字段。如串行链路中的报文分隔符+LRC校验和时间间隔+CRC校验。同样的,在TCP/IP网络上的Modbus协议也引入了一个称为MBAP(Modbus Application Header)报文头的字段。Modbus TCP/IP协议最大帧数据长度为260字节,其中字节0~6构成MBAP报头。单元标识符如果是Modbus服务器连接到Modbus+或Modbus串行链路子网,并通过一个网桥或网关配置这个服务器的IP地址,则Modbus单元标识符对识别连接到网桥或网关后的子网的从站设备是必须的。TCP连接中的目的IP地址识别了网桥本身的地址,而网桥则使用Modbus单元标识符将请求转交给正确的从站设备。对单纯的Modbus TCP/IP设备来说,利用IP地址即可寻址Modbus服务器端设备,此时Modbus单元标识符是无用的,必须使用0xFF填充。当对直接连接到TCP/IP网络上的Modbus服务器寻址时,建议不要在“单元标识符”域使用有效的Modbus从站地址。查询与响应报文举例在Modbus TCP/IP模式下,不需要校验字段。但在特殊场合,例如串行Modbus协议转Modbus TCP的情况下,串行协议数据可以完整的装在到Modbus TCP协议的数据字段,这时CRC或者LRC差错校验字段仍然存在。例如Modbus RTU Over TCP/IP或modbus ASCII Over TCP/IP等。
      Modbus的报文格式

      外行人请求帮助:modbus、rtu、modbus rtu分别是什么?被搞混了。

      我说个简单点的吧 不是复制的哦modbus协议是工控行业的标准协议,前身为莫迪康所写,现已被施奈德收购而modbus分为两种协议即串口协议(modbus rtu)和网口协议(modbus tcp)协议一般的工控机只支持rs232或者RS485的串口模式这个时候工控机的协议栈里就只有modbusRTU协议当他从串口接收到数据时,会直接根据报文中的数据进行控制如果需要用modbusTCP协议进行传输,则需要使用带有网口的PLC具体的帧格式如下modbus RTU 地址域 功能码 数据 差错校验modbus TCP目的地址 协议id 长度 单元号 功能码 数据简单的说 tcp是由RTU加工而来的而RTU则是另外一种概念,不包含在modbus协议内 是工控行业对监控设备的简称。
      Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 RTU(Remote Terminal Unit)是一种远端测控单元装置,负责对现场信号、工业设备的监测和控制。与常用的可编程控制器PLC相比,RTU通常要具有优良的通讯能力和更大的存储容量,适用于更恶劣的温度和湿度环境,提供更多的计算功能。正是由于RTU完善的功能,使得RTU产品在SCADA系统中得到了大量的应用。 远程终端设备(RTU)是安装在远程现场的电子设备,用来监视和测量安装在远程现场的传感器和设备。RTU将测得的状态或信号转换成可在通信媒体上发送的数据格式。它还将从中央计算机发送来得数据转换成命令,实现对设备的功能控制。 监视控制和数据采集是一个含义较广的术语,应用于可对安装在远距离场地的设备进行中央控制和监视的系统。SCADA系统可以设计满足各种应用(水、电、气、报警、通信、保安等等),并满足顾客要求的设计指标和操作概念。SCADA系统可以简单到只需通过一对导线连在远端的一个开关,也可复杂到一个计算机网络,它由许多无线远程终端设备(RTU)组成并与安装在中控室的功能强大的微机通信。SCADA系统的远程终端设备可以用各种不同的硬件和软件来实现。这取决于被控现场的性质、系统的复杂性、对数据通信的要求、实时报警报告、模拟信号测量精度、状态监控、设备的调节控制和开关控制。 变电站是电力系统的一个重要组成部分,它的安全可靠运行是电网安全经济运行的根本保证。当前变电站正以分项自动化向着综合自动化方向发展,综合自动化的近期目标是把变电站的保护、测量、监控、远动等融为一体,取得数据共享,资源共享,大幅度提高自动化的功效。 对于电力系统,为了进行现代化管理,往往实现电网调度自动化,虽然省、地、县各级调度有不同的职能和责任,但其组成基本相同,一般是由主站和远动终端(RTU)组成。远动终端就是电网监视和控制系统中安装在发电厂或变电站的一种远动装置,它负责采集所在发电厂或变电站电力运行状态的模拟量和状态量,监视并向调度中心传送这些模拟量和状态量,执行调度中心发往所在发电厂或变电站的控制和调度命令。然而,随着煤矿现代化管理的飞速发展,实施煤矿安全生产微机监控调度系统已是大势所趋,该系统通过设置在矿调度室的主计算机能实时地监视煤矿井下生产环境安全参数和全矿重要机电设备的工况,从而对各生产环节进行控制和调节,使生产的指挥管理和控制融为一体,成为矿井生产的中枢。 由于矿调度室远离生产现场,因此,矿井上下需要设置多个远动分站。毋庸置疑,煤矿变电站是企业生产的核心和动力源泉,它关系着安全生产和人体安危。变电站的安全管理也是煤矿监控系统的一个重要环节。通常变电站与煤矿生产调度中心往往相距较远,必须采用远动技术,在变电站设置远动终端即RTU,与调度中心计算机通过信道相连接,RTU与调度中心之间通过远距离信息传输完成RTU的远方监控功能。RTU与主站配合可以实现三遥功能,即:遥测、遥信、遥控。
      外行人请求帮助:modbus、rtu、modbus rtu分别是什么?被搞混了。

      modbus通信,设备返回异常81 03

      出现故障。modbus通信协议栈已经实现了面向这些功能码的数据请求命令的生成以及数据响应消息的解析。我们使用协议栈时需要做的就是要告诉协议栈我要生成哪些数据请求命令以及如何解析数据响应消息。 问题明显是干扰引起的,485很多人基本上只接两根线,在共模高的状态下,通信过程容易会受干扰,可以采用屏蔽双绞线,注意一端接地,另外一端不要接。
      modbus通信,设备返回异常81 03

      如何将freemodbus协议栈移植到linux下

      (二)在HHARM2410-R3上的移植 完成了在普通red hat上的安装,熟悉了蓝牙协议栈一些基本的东西,下面的任务就是把协议栈搬到开发板上了。第一步当然是内核了,由于华恒的内核代码改过,我也不知道从bluez上下载的patch能不能使用,试试看了,只好。# cd /HHARM2410/kernel# gzip -dc ~/patch-2.4.18-mh15.gz | patch -p1# find ./ -name '*rej'./fs/cramfs/inode.c.rej不好,有文件不能patch,看看是针对cramfs文件系统的patch,我也不清楚为什么bluez的patch会修改到cramfs,不过我想 问题应该不大。内核源代码关于bluetooth的部分华恒应该没有改过,因此patch的主要部分应该是没有问题的。如果内核编译后发生问题,我想大概 也只有把内核代码翻出来看了。先就这样了,用用试试看好了。与普通pc上的类似,只不过有些是m的现在统统为y了。我的配置关于Bluez的部分设置为:## Bluetooth support#CONFIG_BLUEZ=yCONFIG_BLUEZ_L2CAP=y# CONFIG_BLUEZ_SCO is not setCONFIG_BLUEZ_RFCOMM=yCONFIG_BLUEZ_RFCOMM_TTY=yCONFIG_BLUEZ_BNEP=yCONFIG_BLUEZ_BNEP_MC_FILTER=yCONFIG_BLUEZ_BNEP_PROTO_FILTER=y# CONFIG_BLUEZ_HIDP is not set## Bluetooth device drivers#CONFIG_BLUEZ_HCIUSB=y# CONFIG_BLUEZ_HCIUSB_SCO is not set# CONFIG_BLUEZ_HCIUART is not set# CONFIG_BLUEZ_HCIBFUSB is not set# CONFIG_BLUEZ_HCIDTL1 is not set# CONFIG_BLUEZ_HCIBT3C is not set# CONFIG_BLUEZ_HCIBLUECARD is not set# CONFIG_BLUEZ_HCIBTUART is not set# CONFIG_BLUEZ_HCIVHCI is not setdevice部分就设了个USB的,其他的就不设置了。下面继续make dep;make zImage的常规过程,OK,没有发生编译问题,可以稍微舒口气了。下面要移植Bluez的基础库了,在Redhat 9下执行# ldd /usr/lib/libbluetooth.so.1.0.17libc.so.6 => /lib/libc.so.6 (0x4002c000)/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)发现没有依赖什么莫名其妙的库,应该换个编译器就可以了,configure一下就可以了。我的配置命令很简单:# ./configure --host=armv4l --prefix=/HHARM2410/applications/bluezport/libs CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlibLD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld# make# make installOK了,到了/HHARM2410/applications/bluezport/libs下看看,我也不清楚为什么,居然只有.a和.la的静态库,没有动态库。只好自己动手,到bluz-libs-2.17/src/下,自己编译动态库:# /opt/host/armv4l/bin/armv4l-unknown-linux-gcc -shared -o libbluetooth.so.1.0.17 bluetooth.o hci.o sdp.o再做两个符号连接# ln -s libbluetooth.so.1.0.17 libbluetooth.so# ln -s libbluetooth.so.1.0.17 libbluetooth.so.1好了,库交叉编译完毕,mv到/HHARM2410/application/bluezport/libs/lib文件夹下就可以了。接着移植Bluez的工具集。与库类似,先看一下各个程序需要用到什么库,比如:#ldd /usr/sbin/hcidlibbluetooth.so.1 => /usr/lib/libbluetooth.so.1 (0x40035000)libc.so.6 => /lib/libc.so.6 (0x40042000)/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)挨个试试需要用的工具,发现需要的库华恒和Bluez都提供了,应该换个编译器编译一下就可以了。编译之前我为了到板子上与我自己的手机连接方便修改 了bluez-utils-2.17/hcid/security.c文件,在init_security_data函数中的设置默认的密码,非常简单地 改了两行:strcpy(hcid.pin_code, "123");hcid.pin_len = 3;然后configure我想就行了,我的configure设置为:# ./configure --prefix=/HHARM2410-R3/applications/bluezport/utils --includedir=/HHARM2410-R3/applications/bluezport/libs/include --libdir=/HHARM2410-R3/applications/bluezport/libs/lib --with-bluez=/HHARM2410-R3/applications/bluezport/libs --disable-test --disable-cups --disable-pcmia --host=armv4l CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld# make我在这步make的时候出现了一点小错误,好像是说PATH_MAX没有定义,这个是LINUX设置的存放路径名缓冲区的最大长度。应该是少包含了一个头文件造成的。我没有去仔细考究,就在当前文件下的config.h中添加了三行:#ifndef PATH_MAX#define PATH_MAX 4095/* PAGE_SIZE - 1 */#endif采用简单粗鲁的添加定义的方式。再make,通过。# make install好了,工具集都在/HHARM2410-R3/applications/bluezport/util下了最后,由于在PC的LINUX下的默认pin_helper /usr/bin/bluepin是用python写的代码,在2410上当然不能用了,所以要自己写一个pin_helper的程序。翻翻 /usr/bin/bluepin的代码以及hcid/security.c的代码,事实上hcid进程在验证PIN code的时候开了一个pipe指向pin_helper进程的标准输出,pin_helper进程向用户询问PIN code,如果用户输入密码XXXX就以"PIN:XXXX"的形式写到标准输出中去,如果用户reject就写个"ERR"回去。我以一种最简单的方式实现pin_helper程序,即固定地写一个code回去,比如123,牺牲安全性。用脚本实现就是:#!/bin/shecho "PIN:123"用C实现一个就是:#include int main(int argc, char* argv[]){printf("PIN:123");}交叉编译成my_pin_helper再放到板子的/usr/bin下,那么就可以把板子的hcid.conf修改成:pin_helper /usr/pin/my_pin_helper后来,我在板子上也用MiniGUI写了一个pin_helper,也挺简单的。好了,一切准备完毕,做好ramdisk,记得在/dev下mknod几个rfcomm,放到板子上,可以运行!插上USB适配器,连模块都不用probe# hciconfig hci0 up# hcid -f /etc/bluetooth/hcid.conf # hciconfig -a
      如何将freemodbus协议栈移植到linux下

      freemodbus 与 modbus 的区别

      FreeMODBUS一个奥地利人写的Modbus协议。它是一个针对嵌入式应用的一个免费(自由)的通用MODBUS协议的移植。Modbus是一个工 业制造环境中应用的一个通用协议。Modbus通信协议栈包括两层:Modbus应用层协议,该层定义了数据模式和功能;另外一层是网络层。
      FreeMODBUS是一个针对嵌入式应用的MODBUS协议的移植,Modbus是一种串行通信协议,广泛应用在工业控制系统中,许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。在工业环境中profibus和profinet也比较常用,但是由于协议不同会造成主从站无法通讯,这种情况下需要加协议转换网关,yt-pb-02,yt-pn-03, 等都可以进行协议转换。
      freemodbus 与 modbus 的区别

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/79443.html

          热门文章

          文章分类