最后更新:2021-10-15 12:15:08 手机定位技术交流文章
FreeModbus是奥地利撰写的 Modbus 协议。 它是一个用于嵌入应用程序的自由( 免费) 全球MODBUS 协议的移植。 Modbus 是工业生产环境中使用的一种常见协议。 Modbus 通信平台分为两层: Modbus 应用程序,它规定了数据模式和功能,以及网络层。
FreeModbus支持RRU/ACSCII传输模式以及TCP议定书。
FreeModbus协定的硬件要求非常少——只是任何序列港和足够的微控制器,用于记录和档案管理,以支持模式客数据框架。
现支持如下功能码:
Read Input Register (0x04)
Read Holding Registers (0x03)
Write Single Register (0x06)
Write Multiple Registers (0x10)
Read/Write Multiple Registers (0x17)
Read Coils (0x01)
Write Single Coil (0x05)
Write Multiple Coils (0x0F)
Read Discrete Inputs (0x02)
Report Slave ID (0x11)

FreeModbus的最新版本是V1.6, 可通过以下链接从官方网络下载:
https://www.embedded-solutions.at/en/freemodbus-downloads/
您可以使用 Git 工具或下载已拉链的软件包。
https://github.com/cwalter-at/freemodbus
FreeModbus协定的硬件要求非常少——只是任何序列港和足够的微控制器,用于记录和档案管理,以支持模式客数据框架。
(1) 一个无同步线界面,能够接收缓冲区,完成并用空间间隙发送缓存。
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
在使用操作系统的处理器上,可以通过独立创建工作对操作系统进行 Modbus 时间查询。 小微控制器通常无法使用操作系统,在这种情况下,可以使用一个全局变量完成事件队列( Atmel AVR 移植方式如此 ) 。
使用的 Modbus 模块数量决定了实际储存需求。 以下是支持的功能编译者需要的存储单元清单。 ARM 是一个 GNUARM 编译者。 这是我们20114年埃及抗议活动特别覆盖的一部分。 4 使用 -O1 选项提供。 AVR 值是 WinaVR 编译者。 这是我们2011年埃及抗议活动特别覆盖的一部分。 5 使用 -Os 选项编制。
在物理层, 用户只需配置序列端口和定时器。 界面文件必须更改 。 和 porttimer, c- porttimer, c- porttimer, c- porttimer, c- porttimer, c- porttimer, c- porttimer, c- porttimer, c- porttimer, c- porttimer, c- porttimer
1) void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
函数是创建序列状态。 有两个参数: xRxenable 和 xTxenable 。 如果 XRxenable 是真实的, 它应该能够接收和接收一系列嘴部的中断。 在 RS485 通信系统中, 还应当注意将 RS485 接口芯片配置为发送推进器; 如果 XTxenable 是真实的, 它应该能够连续发送和传输 。
2) void vMBPortClose( void )
该功能关闭莫德布斯通信港,特别是通信港的发送和接收使能器。
3) BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity)
此函数是初始字符串通信端口。 有四个参数 : ucport、 ulBaudRate、 ucDataBits 和 eParacy 。 参数 ucport 可能被忽略 ; 参数 ulBaudRate 是通信端口的端口速率, 该端口应该以用于设定此值的硬件端口的端口速率为基础; 参数 ucDataBits 是用于通信的数据的空间宽度。 注意如果使用 RTU 模式, 有 ucDataBits=8, 如果使用 ASCII 模式, 有 ucDataBits=7, 所使用的硬件端口的数据宽度应该以此参数为基础; eParity=MB_PAR_NONE 是非核查方法, 此时硬件端口应该设置为随机检查, 停止位函数返回 TRUE 值 。
4) BOOL xMBPortSerialPutByte(CHAR ucByte)
函数将一个字节数据传送到通信端口。 参数是: ucByte, 数据将发送。 在此函数中, 您应准备一个函数来发送一个字节数据。 注意由于它被用于中断传输, 必须在发送者登记册中放置数据。 函数返回 TRUE 。
5) BOOL xMBPortSerialGetByte( CHAR * pucByte )
3⁄4 ̄ ̧漯B
6) void prvvUARTTxReadyISR(void)
此函数不需要更改。 您可以在用户发送断段功能中调用此函数, 用户在使用此函数后应该清除发送断段符号 。
7) void prvvUARTRxISR(void)
此函数不需要更改。 您可以在用户的接受断开函数中调用此函数, 用户在调用此函数后应该清除接收断开符号 。
1) BOOL xMBPortTimersInit( USHORT usTim1Timerout50us )
此函数的参数是: 我们Tim1 Timm1 Timorrout50us 的数, 50us 的数。 用户应该根据所使用的硬件设定超时计时器, 这样它可以中断 Tim1 Timm1 Timorrout50us* 50us. 函数返回结果 TRUE 。
2) void vMBPortTimersEnable( )
此函数作为计时器。 要使用它, 用户必须删除断段标记、 零计时器, 并重新启动计时器 。
3) void vMBPortTimersDisable( )
函数关闭计时器。在此函数下,用户必须清除零计时器并关闭计时器。
4) void TIMERExpiredISR( void )
定时器中断函数。此函数不需要更新。只需在用户的定时器中断中调用,在调用后,用户应清除断线符号位置。
用户必须声明要使用登记册,并更改应用程序层中的相关回声函数。
1) eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
在此插入登记册回声功能 。 * PucRegBuffer 是要添加到协议中的数据, 我们地址是输入登记册的地址, 而 usNRegs 是要读取的存款数量。 用户根据要访问的登记册的地址, 给公众添加必要的存储值 。
2) eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
* PucRegBuffer是协议数据,我们地址是进入登记册的空位数,我们NRegs是进入登记册的空位数,eMode是访问类型(MB_REG_READ来维持阅读登记册,MB_REG_REITE来保持写作登记册)。 用户应根据要访问的登记册地址、我们地址或地址,将相关值添加到登记册上。
3) eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
读写环回回声函数。 * PucRegBuffer 是要添加到协议中的数据, 我们地址是圆圈地址, WeAddress 是要访问的圆圈数量, 电子Mode 是访问类型( MB_REG_READ 是读取圆圈状态, MB_REG_RWITE 是写线圈)。 用户应该根据要访问的圆圈地址, 或放置鼠标, 将合适的圆圈的值按顺序添加到公共地址。
4) eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
3⁄4 ̄ ̧漯B
用户只需在主函数中调用协议初始化代码, 以及电文处理功能。 用户必须调用以下功能:
1) eMBErrorCode eMBInit( eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity )
协议初始化函数。 eMode 是将要使用的模型, 用户可以选择 MB_ RTU (RTU 模式)、 MB_ ASCII (ASCII 模式) 或 MB_ TCP (TCP 模式); ucSlaveAddress 是机器地址, 用户取 1 - 247 (0 是广播地址, 保留 248 255); ulBaudRate 是用户必要时选择的电信端口速率, 但是,
2) eMBErrorCode eMBSetSlaveID( UCHAR ucSlaveID, BOOL xIsRunning, UCHAR constpucAdditional, USHORT usAdditionalLen )
从机器 ID 设定功能 。 注意 ID 指定设备类型, 与 ucSlave Address (来自机器地址) 不同 。 同一通信系统可以使用相同的 ucSlaveID, 但不同的 ucSlaveAddress. ucSlaveID 不是一个字节设备 ID; xIsRunning 是设备的有效状态, 0xFF 正在运行, 0x00 被停止 。不需要使用此方法。 但是, 当 Modbus 通信系统由不同的设备组成时, 此函数应该用于添加相关设备的描述 。 附加性是设备的额外描述, 需要时要添加; usApplicalLen 是额外的描述长度( 字节 ) 。
3) eMBErrorCode eMBPoll( void )
用户必须在主循环中调用此方法。 对于使用操作系统的应用程序,应另设一项任务,以使操作系统能够按周期调用此功能。
FreeModbus 以信件队列协议为基础。 协议协议通过检测相应信息来履行相关功能。 协议仓库的初始化和运行程序以信件队列协议为基础,符合以下适当程序。 协议仓库的初始化和运行程序通过检测相应信息来履行相关功能。 协议仓库的初始化和运行程序如下:
1) 物理层设备通过首先执行 EMBErrorCode EMBInit (EMBMode eMode, Uchar ucSlaveAddress, Uchar ucport, ULONG ulBaudRate, eMBPPeity ePeparity) 启动:
BOOL xMB 港口航空(UCHAR ucport, ULONG ulBaudRate, UUHAR ucDataBit, eMBPeparity ePeparity) 启动并确定港口费率、数据位置计数和核实方法; BOOL xMB PortTimesInit (USHORT us Tim1 Tymrout50us) 启动T35 固定所需的定时器常数 。
2) (可选择) eMBErrorCode emMBSetSlaveID (Uchar ucSlaveID, BOOL xIsRunning, Uchar Const * 出版物, USHORT us AllitiveLen) 指定设备代号 。
3) 调用 EMBErrorCode eMBEnalable( 无效) 以使其能够, 主要是: 状态 pvMBFrameStart pvMBFrame StartCur( 函数指针), 启动 eRcv State 到STate_ RX_ INIT 状态, 使用无效 vMBP PportSealEnable (BOOL xRxEnable, BOOL xTxEable) 以使其能够接收和接收
(4) 第一次超时是在T35小时后发生的,在此期间,EV_READY(启动完成)电文被发送到协议仓库,VMB PortTimes Disable () 将 eRcv State 更改为STATE_RX_IDLE.At此点时,协议仓库可以接受序列数据。请注意,这里先插入计时器是因为数据在启动时在序列端口可能已经可访问,所以这里首先插入了计时器。
主函数现在调用 EMBErrorCode EMBPol( 避免) 来检测事件 。
6) 如果发生序列接收中断,且 eRcvstate 设为STate_RX_IDLE (4 将 eRcvstate 设为STate_RX_IDLE), 接收的字符将存放在接收缓存中, 且 eRcvstate 设为STate_ RX_RCV 状态, 且无超时计。 当下一个数据出现时, 数据将保存在接收缓存中, 并清除计时器 。
7) 如果接收尚未完成,则不允许超时。超时中断表明,T35期间没有收到新的序列数据,根据Modbus协议,这促使要求完成数据接收。在中断期间,EV_FRAME_RECEIVED(收到Frame的电文)发送到协议柜台,等待信件处理。
8) 一旦主要功能通过使用eMBErrorCode eMBPol(撤销)检测事件EV_FRAME_RECEIVED,请国家pEMBramreRevived pMBFramereReceiveCur简单地判断请求框架数据,并将EV_EXECUTE(执行功能)信息发送到协议柜台。
(9) 当 eMBErrorCode eMBPol( 避免) 检测主函数时, 函数通过查找根据相关请求代码处理该函数的功能指针来处理。 如果它不是广播新闻, 请调用国家 pMBFrameSend pMMFrameSend pMMFRAMESendCur 发送回复。 只需将要返回的数据以这种方法放入链条缓存, 而 eSnd State 设置为STate_ TX_ MIT( 转移者处于中转状态), 并通过使用无效的 vMBportSerio Enable (BOOL xRxEnable, BOL xTxEnable) 停止传输 。
10) 链条缓存中的数据由电子Snd State发送到STate_TX_XMIT(电子Snd State设于9),传输字符的数量不断统计,EV_FRAME_SENT(发送Frame)信息发送到协议仓库。
11) 主函数在检测事件 EV_FRAME_SENT 后,不会使用 EMBErrorCode eMBPolll (没有) 来处理此信件 。
(12) 在序列条目收到数据时,协议柜台将重复6-11处理电文。
资料来源:
https://baike.baidu.com/item/freemodbus/7566841?fr=aladdin
资料来源:
http://emb.hqyj.com/Column/7504.html
本文由 在线网速测试 整理编辑,转载请注明出处。