本帖最后由 qwdx2011 于 2016-6-29 11:52 编辑
昨天刚移植完Freemodbus的 RTU协议,今天想着移植一下 TCP modbus ,借着前辈们的经验不到两小时成功移植,有兴趣的朋友可以参照我的方法移植一下,TCP modbus的具体实现方法和协议等在此不再赘述,如果不了解可以参看这两个帖子 http://blog.csdn.net/xukai871105/article/details/21652287
http://blog.csdn.net/daniellee_ustb/article/details/8743276
好了不啰嗦现在开始:
1、硬件+TCP协议栈: LAN8720+LWIP 例程可以参看原子的例程 UCOS+lwip例程
2、开发环境:MDK511
第一步:需要编写一个文件porttcp.c 我下面附录会给,直接加入工程中
编译出现如下错误:
修改如下:
在port.c文件中加入:
void EnterCriticalSection( ) { __ASM volatile("cpsid i"); }
void ExitCriticalSection( ) { __ASM volatile("cpsie i"); } 在port.h文件中加入: #define vPortEnterCritical( ) EnterCriticalSection( ) #define vPortExitCritical( ) ExitCriticalSection( )
在porteven.c中添加: static eMBEventType eTCPQueuedEvent ; static BOOL xTCPEventInQueue= FALSE;
BOOL xMBTCPPortEventInit( void ) { xTCPEventInQueue = FALSE; return TRUE; }
void vMBTCPPortEventClose( void ) { xTCPEventInQueue = FALSE; }
BOOL xMBTCPPortEventPost( eMBEventType eEvent ) { xTCPEventInQueue = TRUE; eTCPQueuedEvent = eEvent; return TRUE; }
BOOL xMBTCPPortEventGet( eMBEventType * eEvent ) {
if( xTCPEventInQueue ) { *eEvent = eTCPQueuedEvent; xTCPEventInQueue = FALSE; return TRUE; } else { return FALSE; } }
编译无错误。 第二步:将mb.c文件中的内容替换:(附录会给出) 编译还有4个错误: 在mbconfig.h中将#define MB_TCP_ENABLED ( 0 ) 改为: #define MB_TCP_ENABLED ( 1 ) 编译无错误。
第三步:修改main函数 初始化加入: eMBTCPInit( TCP_SERVER_PORT ); eMBEnable( MB_TCP );
在while循环中加入: eMBPoll();
编译下载......
先ping一下:
打开Modbus Poll设置如下: 以下是我定义的保持寄存器的值 u16 usRegHoldingBuf[REG_HOLDING_NREGS]={0x0102,0x0304,0x0506,0x0708,0x1122,0x3344,0x5566,0x7799};
连接成功!返回如下: 此时,FreeModbus TCP移植成功! TCP Modbus和Serial Modbus可独立工作,以下是Modbus RTU返回的数据:
|