CC3200 freemodbus-tcp移植过程

来源:互联网 发布:淘宝退款在哪里看 编辑:程序博客网 时间:2024/05/17 07:07
  • 工程所在github:https://github.com/RaphaelZheng/CC3200-MODBUS-TCP

准备工作

  1. 一个wifi:提供连接测试
  2. freemodbus包:移植需要
    • 我这里选择的是freemodbus-v1.50
  3. CC3200开发环境
    • 我使用的是CCS
    • 需要下载SDK,通过改编example来移植

移植分析

  1. 根据modbus-tcp原理分析得知需要通过socket进行通信,所以选择了TI提供的SDK中examples中的tcp_socket进行移植操作

移植过程

  • modbus文件
    1. 选择freemodbus中的模块
      • 我这里选择了demo中的MCF5235TCP作为参考模板!
        • image
    2. 在MCF5235TCP我们需要选择port文件夹,并在portttcp.h中添加simplelink.h头文件,然后注释掉所有的lwip相关头文件
      • image
    3. 将modbus文件夹中的functions、include、tcp文件夹以及mb.文件全部添加到工程中
      • 最终modbus模块包含文件
      • image
      • 还有一些全局变量需要修改,请按程序报错修改
      • image
  • CCS工程文件修改
    1. 添加头文件文件夹,将相应modbus下属文件夹都添加进去
    2. main文件修改
      • 将demo.c中的一些宏定义复制过来
        • image
      • 利用socket的BsdTcpServer进行修改
int BsdTcpServer(unsigned short usPort){    SlSockAddrIn_t  sAddr;    SlSockAddrIn_t  sLocalAddr;    int             iCounter;    int             iAddrSize;    int             iSockID;    int             iStatus;    int             iNewSockID;    long            lLoopCount = 0;    long            lNonBlocking = 1;    int             iTestBufLen;    iTestBufLen  = BUF_SIZE;    //filling the TCP server socket address    sLocalAddr.sin_family = SL_AF_INET;    sLocalAddr.sin_port = sl_Htons((unsigned short)usPort);    sLocalAddr.sin_addr.s_addr = 0;//    // creating a TCP socket//    iSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);////    if( iSockID < 0 )//    {//        // error//        ASSERT_ON_ERROR(SOCKET_CREATE_ERROR);//    }//////    iAddrSize = sizeof(SlSockAddrIn_t);////        // binding the TCP socket to the TCP server address//        iStatus = sl_Bind(iSockID, (SlSockAddr_t *)&sLocalAddr, iAddrSize);//        if( iStatus < 0 )//        {//            // error//            sl_Close(iSockID);//            ASSERT_ON_ERROR(BIND_ERROR);//        }////        // putting the socket for listening to the incoming TCP connection//        iStatus = sl_Listen(iSockID, 0);//        if( iStatus < 0 )//        {//            sl_Close(iSockID);//            ASSERT_ON_ERROR(LISTEN_ERROR);//        }        vMBServerTask();        while(1)        {            eMBPoll();        }//        // setting socket option to make the socket as non blocking//        iStatus = sl_SetSockOpt(iSockID, SL_SOL_SOCKET, SL_SO_NONBLOCKING,//                                &lNonBlocking, sizeof(lNonBlocking));//        if( iStatus < 0 )//        {//            sl_Close(iSockID);//            ASSERT_ON_ERROR(SOCKET_OPT_ERROR);//        }//    iNewSockID = SL_EAGAIN;////////////    // waiting for an incoming TCP connection//    while( iNewSockID < 0 )//    {//        // accepts a connection form a TCP client, if there is any//        // otherwise returns SL_EAGAIN//        iNewSockID = sl_Accept(iSockID, ( struct SlSockAddr_t *)&sAddr,//                                (SlSocklen_t*)&iAddrSize);////        /*//        eMBErrorCode    xStatus;//                    UCHAR test_array[5];//                    xStatus = eMBRegHoldingCB( test_array, 0, 5,MB_REG_WRITE);//                    UART_PRINT( "eMBRegHoldingCB%d\r\n",xStatus );//                    xStatus = eMBPoll();//                    UART_PRINT( "eMBPoll%d\r\n",xStatus );//                    //* An error occured. Maybe we can restart. *///                    /*//                    while(1)//                    {//                        xStatus =eMBRegHoldingCB(test_array,0,1,MB_REG_READ);//                        if(test_array[0]==6)//                        {////                            UART_PRINT( "eMBDisable\r\n");//                                ( void )eMBDisable(  );//                                UART_PRINT( "eMBClose\r\n");//                                ( void )eMBClose(  );//                        }//                    }*/////    }////    // waits for 1000 packets from the connected TCP client////    int t=0;//    while (lLoopCount < g_ulPacketCount)//    {//        iStatus = sl_Recv(iNewSockID, g_cBsdBuf, iTestBufLen, 0);//        Report("Recieved times%d",++t);//        int i=0;//        for( i=0;i<20;i++)//        {//            Report("%x\r\n",g_cBsdBuf[i]);//        }//        Report("\n\r");//        if( iStatus <= 0 )//        {//          // error//          sl_Close(iNewSockID);//          sl_Close(iSockID);//          ASSERT_ON_ERROR(RECV_ERROR);//        }////        lLoopCount++;//    }////    //Report("Recieved %u packets successfully\n\r",g_ulPacketCount);////    // close the connected socket after receiving from connected TCP client//    iStatus = sl_Close(iNewSockID);//    ASSERT_ON_ERROR(iStatus);//    // close the listening socket//    iStatus = sl_Close(iSockID);//    ASSERT_ON_ERROR(iStatus);    return SUCCESS;}
  • server初始化
voidvMBServerTask( void ){    eMBErrorCode    xStatus;    UCHAR const * a=NULL;    eMBSetSlaveID( 1, 0xff,a,0);//设置从机    UART_PRINT( "vMBServerTask\r\n");        if( eMBTCPInit( MB_TCP_PORT_USE_DEFAULT ) != MB_ENOERR )        {            UART_PRINT( "can't initialize modbus stack!\r\n");        }        else if( eMBEnable(  ) != MB_ENOERR )        {            UART_PRINT( "can't enable modbus stack!\r\n" );        }}
  • main函数中还有一些非tcp模式的需要注释,具体请参考我的github

测试连接

  1. CC3200连接上wifi,等待主机连接
    • image
  2. 启动主机测试
    • image
    • 可以实现改写寄存器和读取寄存器数据
0 0
原创粉丝点击