转自 http://blog.sina.com.cn/s/blog_4935209001012eb5.html
// Initialize protocol stack in RTU mode for a slave with address 10 = 0x0A
eMBInit( MB_RTU, 0x0A, 38400, MB_PAR_EVEN );
// Enable the Modbus Protocol Stack.
eMBEnable( );
for( ;; )
{
// Call the main polling loop of the Modbus protocol stack.
eMBPoll( );
...
}
|
|
|
定义 |
|
#define |
MB_TCP_PORT_USE_DEFAULT 0 |
枚举类型 |
|
enum |
eMBMode { MB_RTU, MB_ASCII, MB_TCP } Modbus协议的模式:RTU ,ASCII 和TCP |
enum |
eMBRegisterMode { MB_REG_READ, MB_REG_WRITE } Modbus寄存器的模式:READ和WRITE |
enum |
eMBErrorCode { 错误码:没有错误,没有寄存器,无效, , ,IO错误,无效 ,超时 |
enum |
eMBParity { MB_PAR_NONE, MB_PAR_ODD, MB_PAR_EVEN } Modbus数据帧的校验类型:无校验,偶校验,奇校验 |
函数 |
|
eMBErrorCode |
eMBInit (eMBMode eMode,UCHAR ucSlaveAddress, UCHAR ucPort, ULONGulBaudRate, eMBParityeParity) 协议初始化函数 输入参数: eMBMode eMode,Modubus协议模式 UCHAR ucSlaveAddress, 子模块地址 UCHAR ucPort, 端口 ULONG ulBaudRate, 波特率 eMBParity eParity 串行数据的奇偶校验 |
eMBErrorCode |
eMBTCPInit (USHORTusTCPPort) 如果使用了TCP协议,则用该函数进行初始化 |
eMBErrorCode |
eMBClose (void) 关闭Modbus协议栈 |
eMBErrorCode |
eMBEnable (void) 使能Modbus协议栈 |
eMBErrorCode |
eMBDisable (void) 禁止Modbus协议栈 |
eMBErrorCode |
eMBPoll (void) 周期性调用的协议处理函数 |
eMBErrorCode |
eMBSetSlaveID (UCHARucSlaveID, BOOL xIsRunning, UCHAR const *pucAdditional, USHORTusAdditionalLen) 设置子模块ID 输入参数: UCHAR ucSlaveID, 子模块ID BOOL xIsRunning, UCHAR const *pucAdditional, USHORT usAdditionalLen |
eMBErrorCode |
eMBRegisterCB (UCHARucFunctionCode, pxMBFunctionHandler pxHandler) Modbus协议的寄存器回调函数 输入参数: UCHAR ucFunctionCode, 功能码 pxMBFunctionHandler pxHandler功能码对应的处理函数 |
#defineMB_TCP_PORT_USE_DEFAULT 0 |
|
Use the defaultModbus TCP port (502). 使用缺省的ModbusTCP移植 Examples: MCF5235TCP/demo.c, STR71XTCP/demo.c,and WIN32TCP/demo.cpp. |
|
|
在协议栈中所有函数使用的错误码 枚举值:
例子: AT91SAM7X_ROWLEY/demo.c, AVR/demo.c, LINUX/demo.c, MCF5235/demo.c,MCF5235TCP/demo.c, MSP430/demo.c, STR71X/simple2.c, STR71XTCP/demo.c, WIN32/demo.cpp,and WIN32TCP/demo.cpp. |
|
Modbus serialtransmission modes (RTU/ASCII). Modubs串行传输模式 Modbus串行传输支持两种模式,ASCII或者是RTU。RTU模式较快但是具有较高的硬件要求并且要求网络延迟要低。ASCII模式较慢,但是在低速连接中更加可靠(如moderms)。 枚举值:
|
|
|
串行模式中字符的极性 串行字符传输时应用的校验格式。需要注意,这个值其实是传给移植层,并且不是所有的奇偶模式都能有效。 Enumeration values:
|
|
寄存器是读还是写 值将传给支持读或者写寄存器的回调函数。写意味着应用寄存器更新,读表示Modbus协议栈需要知道当前寄存器的数值。 See also: eMBRegHoldingCB(), eMBRegCoilsCB(), eMBRegDiscreteCB() and eMBRegInputCB(). 枚举值:
例子: AT91SAM7X_ROWLEY/demo.c, AVR/demo.c, LINUX/demo.c, MCF5235/demo.c,MCF5235TCP/demo.c, MSP430/demo.c, STR71X/simple2.c, STR71XTCP/demo.c, WIN32/demo.cpp,and WIN32TCP/demo.cpp. |
eMBErrorCode eMBClose(void ) |
|
|
|
|
|
释放协议栈使用的资源。 该函数禁止Modbus协议栈并且释放所有的硬件资源。只有当协议栈被禁止了,才能调用这个函数。 注意: Note all ports implement this function. A port which wantsto get an callback must define the macro MB_PORT_HAS_CLOSE to1. 注意所有的移植都要实现这个函数。需要获取回调 返回: 如果资源释放了,该函数返回eMBErrorCode::MB_ENOERR。如果协议栈不是处于禁止状态,它返回eMBErrorCode::MB_EILLSTATE。
例子: LINUX/demo.c, MCF5235TCP/demo.c, STR71XTCP/demo.c, WIN32/demo.cpp,andWIN32TCP/demo.cpp.
|
eMBErrorCode eMBDisable(void ) |
|
|
|
|
|
禁止Modbus协议栈。 这个函数禁止处理Modbus帧。 返回: If the protocol stack has been disabled itreturns eMBErrorCode::MB_ENOERR.If it was not in the enabled state itreturns eMBErrorCode::MB_EILLSTATE. 例子: LINUX/demo.c, MCF5235TCP/demo.c, STR71XTCP/demo.c, WIN32/demo.cpp,andWIN32TCP/demo.cpp.
|
|
使能Modbus协议栈 本函数使能Modbus帧的处理。 返回: If the protocol stack is now in the state enabled itreturns eMBErrorCode::MB_ENOERR.If it was not in the disabled state itreturn eMBErrorCode::MB_EILLSTATE. 例子: AT91SAM7X_ROWLEY/demo.c, AVR/demo.c, LINUX/demo.c, MCF5235/demo.c,MCF5235TCP/demo.c, MSP430/demo.c, STR71X/simple2.c, STR71XTCP/demo.c, WIN32/demo.cpp,and WIN32TCP/demo.cpp. |
|
( |
eMBMode eMode, |
|
|
UCHAR ucSlaveAddress |
|
|
UCHAR ucPort, |
|
|
ULONG ulBaudRate, |
|
|
eMBParity eParity |
|
) |
|
|
初始化Modbus协议栈 该函数初始化为ASCII或者RTU模式,并且调用移植层的初始化函数来准备硬件。需要注意的是,接受依然是禁止的,并且Modbus数据帧都不会得到处理,除非eMBEnable()被调用。 参数:
返回: 如果没有错误,这个函数返回eMBErrorCode::MB_ENOERR。协议栈将处于禁止状态,可以通过调用eMBEnable( )来激活。否则,将返回下列的一个错误: · eMBErrorCode::MB_EINVAL 如果子模块地址无效。 · eMBErrorCode::MB_EPORTERR 如果移植层返回一个错误。 例子: AT91SAM7X_ROWLEY/demo.c, AVR/demo.c, LINUX/demo.c, MCF5235/demo.c, MSP430/demo.c,STR71X/simple2.c,and WIN32/demo.cpp. |
eMBErrorCode eMBPoll( void )
|
Modbus协议栈的主轮询函数。 该函数必须被周期性调用。两次调用的时间间隔决定于Modbus的超时时间设置。在函数内部调用了xMBPortEventGet()函数来等待接受或者发送状态机发出的事件。 返回: 如果协议栈没有被使能,这个函数返回eMBErrorCode::MB_EILLSTATE.,否则返回eMBErrorCode::MB_ENOERR. 例子: AT91SAM7X_ROWLEY/demo.c, AVR/demo.c, LINUX/demo.c, MCF5235/demo.c,MCF5235TCP/demo.c, MSP430/demo.c, STR71X/simple2.c, STR71XTCP/demo.c, WIN32/demo.cpp,and WIN32TCP/demo.cpp. |
eMBErrorCode eMBRegisterCB |
( |
UCHAR |
ucFunctionCode, |
|
|
pxMBFunctionHandler |
pxHandler |
|
) |
|
为给定的功能码注册一个回调处理函数。 这个函数为一个给定的功能代码注册一个新的回调函数。提供的回调函数负责解释ModbusPDU并且创建一个合适的应答。当错误发生时,这个函数会返回一个Modbus异常,该异常是由协议栈发送的Modbus异常。 参数:
返回: eMBErrorCode::MB_ENOERR 如果回调函数正常安装。如果资源不足,将返回eMBErrorCode::MB_ENORES. 在这种情况下,在 mbconfig.h 中定义的数值必须进行修改。如果参数无效,函数将返回 eMBErrorCode::MB_EINVAL. |
设置设备的ID 当使用Modbus的Report Slave ID 功能时,这个函数将会被调用(通过在mbconfig.h 中定义MB_FUNC_OTHER_REP_SLAVEID_ENABLED)。 参数:
返回: If the static buffer defined byMB_FUNC_OTHER_REP_SLAVEID_BUF in mbconfig.h isto small it returnseMBErrorCode::MB_ENORES.Otherwise it returns eMBErrorCode::MB_ENOERR. 例子: AVR/demo.c, LINUX/demo.c, MCF5235/demo.c,and WIN32/demo.cpp. |
|
( |
USHORT |
usTCPPort |
) |
|
ModbusTCP的协议初始化 该函数初始化ModbusTCP 模块。注意,帧处理在eMBEnable()函数调用之前是禁止掉的。 参数:
返回: 如果协议栈初始化正确,函数返回MB_ENOERR。否则,函数会返回如下的错误码:
· eMBErrorCode::MB_EINVAL如果子模块地址无效,有效的子地址范围是1-247 · eMBErrorCode::MB_EPORTERR如果移植层返回一个错误。 Examples: MCF5235TCP/demo.c, STR71XTCP/demo.c,and WIN32TCP/demo.cpp. |