C++上位机通过socket读写PLC


做上位机的同行应该有切实体会:由于某些厂家的通信协议不开放的缘故,通信是个很费劲的事,特别是和西门子的通信。就我目前所知,通信手段主要依赖于两条路:

a.OPC,我们自己开发client端,server端借助simatic net 或者kepserver 

b.组态软件,组态软件就不说了,稍微会点编程的人都不想用这东西。

OPC服务端和组态软件都需要花钱购买(当然盗版除外),并且是一次性的,使用体验感非常不爽,基于如此,我一直想找一个可替换的方案用于和PLC通信,经过多方面的探索验证,终于找出一条不用经过任何中转,借助socket完全用代码实现的通信路径,主要特征如下:

1.VS2015 C++ MFC开发

2.可实现和200,300,400,1500,1200对接通信(200没测过)

3.可直接读写台达(ModBus)信息

1.台达指令示意

 

     //*********************0F功能码,写多个位寄存器的值**********************************//

     /*********************************************************************************/

    //****00 00  00 00     00 08         01       0F    A0 00  00 08   01     81********//

    //**** 事务 | 协议  |Modbus数据长度|Modbus站号|功能码|首地址|写入个数|字节数| 值*******//

     CString CDelta::WriteMoreRegistersBit(int FunNum, int Mod_Sta, int FristAds, int bitNum, int* pVal)

     {  

          CString strModlen,//modbus数据长度

          strFun,//功能码

          strMsta, //PLC站

          strFristAds,//首地址

         strWtbitnum,//写入个数

         strWtbytenum,//地址个数(字节)

         strWtVal,//数值

         strlabel;//指令

        

         strModlen.Format(_T("%04X"), (int)ceil(bitNum /15.0) + 7);//modbus数据长度

         strFun.Format(_T("%02X"), 15);

         strMsta.Format(_T("%02X"), Mod_Sta);

         strFristAds.Format(_T("%04X"), FristAds);

         strlabel = _T("00 00 00 00 ") + strModlen + _T(" ") + strMsta + _T(" ") + strFun + _T(" ") + strFristAds;

         strWtbitnum.Format(_T("%04X"), bitNum);

         strWtbytenum.Format(_T("%02X"), (int)ceil(bitNum / 15.0));

         strlabel = strlabel + _T(" ") + strWtbitnum + _T(" ") + strWtbytenum;

         for (int i = 0; i < (int)ceil(bitNum / 15.0); i++)

         {

               strWtVal.Format(_T("%02X"), *(pVal + i));

               strlabel += _T(" ") + strWtVal;

         }

         return strlabel;

    }

   2.西门子指令示意

  

    /**01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23  24 25      26 27   28 29 30 31**/

    /**03 00 00 1F 02 F0 80 32 01 00 00 00 01 00 0E 00 00 07 01 12 0A 10 02  00 02      00 0A   82 00 00 00**Y-output/

    CString CSimatic::ReadRegXYBit(int seqnum, int Fun, int Rdlen, int DataType, int offset)//读取X-input

    {

       CString strHead = _T("03 00"),                   

       strtolen = _T("00 1F"),                         

       strconst1 = _T("02 F0 80 32 01 00 00"),          

       strseqnum,                                        //序列号

       strconst2 = _T("00 0E"),                       

       strconst3 = _T("00 00"),                       

       strFun,                                           //功能码

       strconst4 = _T("01 12 0A 10 02"),              

       strRdlen,                                         //读取长度

       strDB = _T("00 00"),                             

       strDataType,                                      //访问数据类型

       stroffset;

      

       strseqnum.Format(_T("%04X"), seqnum);

       strFun.Format(_T("%02X"), Fun);

       strRdlen.Format(_T("%04X"), Rdlen);

       strDataType.Format(_T("%02X"), DataType);

       stroffset.Format(_T("%06X"), offset);

       CString strlabel;

       strlabel = strHead + _T(" ") + strtolen + _T(" ") +

       strconst1 + _T(" ") + strseqnum + _T(" ") +

       strconst2 + _T(" ") + strconst3 + _T(" ") +

       strFun + _T(" ") + strconst4 + _T(" ") +

       strRdlen + _T(" ") + strDB + _T(" ") +

       strDataType + _T(" ") + stroffset;

     

    return strlabel;

    }

试用版工具可免费试用,

有意者请访问https://blog.csdn.net/li634471989/article/details/90291056,

或加q:634471989了解


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM