久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3226|回復: 1
打印 上一主題 下一主題
收起左側

分享libnodave-0.8.5,西門子PLC通訊方法

[復制鏈接]
跳轉到指定樓層
樓主
直接上附件。


單片機源程序如下:
  1. /*
  2. Part of Libnodave, a free communication libray for Siemens S7 200/300/400 via
  3. the MPI adapter 6ES7 972-0CA22-0XAC
  4. or  MPI adapter 6ES7 972-0CA23-0XAC
  5. or  TS adapter 6ES7 972-0CA33-0XAC
  6. or  MPI adapter 6ES7 972-0CA11-0XAC,
  7. IBH/MHJ-NetLink or CPs 243, 343 and 443

  8. (C) Thomas Hergenhahn (thomas.hergenhahn@web.de) 2002..2005

  9. S5 basic communication parts (C) Andrew Rostovtsew 2004.

  10. Libnodave is free software; you can redistribute it and/or modify
  11. it under the terms of the GNU Library General Public License as published by
  12. the Free Software Foundation; either version 2, or (at your option)
  13. any later version.

  14. Libnodave is distributed in the hope that it will be useful,
  15. but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. GNU General Public License for more details.

  18. You should have received a copy of the GNU Library General Public License
  19. along with Libnodave; see the file COPYING.  If not, write to
  20. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
  21. */
  22. #include "nodave.h"
  23. #include <stdio.h>
  24. #include "log2.h"
  25. #include <string.h>

  26. #define DUMPLIMIT 11132

  27. #define DAVE_HAVE_MEMCPY  // normally we have

  28. //#define DEBUG_CALLS        // Define this and recompile to get parameters and results
  29.                         // of each function call printed. I could have made this an
  30.                         // option bit in daveDebug, but most applications will never,never
  31.                         // need it. Still they would have to do the jumps...
  32.                         // This option is just useful when developing bindings to new
  33.                         // programming languages.
  34. /**
  35.     Library specific:
  36. **/
  37. #ifdef LINUX
  38. #define HAVE_UNISTD
  39. #define HAVE_SELECT
  40. #define DECL2
  41. #include <time.h>
  42. #include <sys/time.h>
  43. #endif

  44. #ifdef HAVE_UNISTD
  45. #include <unistd.h>
  46. #define daveWriteFile(a,b,c,d) d=write(a,b,c)
  47. #endif

  48. #ifdef AVR
  49. #include <unistd.h>
  50. #endif

  51. int daveDebug=0;

  52. #ifdef BCCWIN
  53. #include <winsock2.h>
  54. #include "openS7online.h"        // We can use the Siemens transport dlls only on Windows

  55. void setTimeOut(daveInterface * di, int tmo) {
  56.     COMMTIMEOUTS cto;
  57. #ifdef DEBUG_CALLS
  58.     LOG3("setTimeOut(di:%p, time:%d)\n",        di,tmo);
  59.     FLUSH;
  60. #endif            
  61. //    if(di->fd.connectionType==daveSerialConnection) {
  62.         GetCommTimeouts(di->fd.rfd, &cto);
  63.         cto.ReadIntervalTimeout=0;
  64.         cto.ReadTotalTimeoutMultiplier=0;
  65.         cto.ReadTotalTimeoutConstant=tmo/1000;
  66.         SetCommTimeouts(di->fd.rfd,&cto);
  67. //    } else if(di->fd.connectionType==daveTcpConnection) {  
  68. //    }
  69. }   
  70. #endif


  71. #ifdef HAVE_SELECT
  72. int DECL2 stdwrite(daveInterface * di, char * buffer, int length) {
  73.     if (daveDebug & daveDebugByte)
  74.         _daveDump("I send", (uc*)buffer, length);
  75.     return write(di->fd.wfd, buffer,length);
  76. }

  77. int DECL2 stdread(daveInterface * di, char * buffer, int length) {
  78.     fd_set FDS;        
  79.     struct timeval t;
  80.     int i;
  81.     t.tv_sec = di->timeout / 1000000;
  82.     t.tv_usec = (di->timeout % 1000000);
  83.     FD_ZERO(&FDS);
  84.     FD_SET(di->fd.rfd, &FDS);
  85.     i=0;
  86.     if(select(di->fd.rfd + 1, &FDS, NULL, NULL, &t)>0) {
  87.         i=read(di->fd.rfd, buffer, length);
  88.     }
  89. //    if (daveDebug & daveDebugByte)
  90. //        _daveDump("got",buffer,i);
  91.     return i;
  92. }
  93. #endif

  94. #ifdef BCCWIN

  95. int DECL2 stdread(daveInterface * di,
  96.          char * buffer,
  97.          int length) {
  98.     unsigned long i;
  99.     ReadFile(di->fd.rfd, buffer, length, &i, NULL);
  100. //    if (daveDebug & daveDebugByte)
  101. //        _daveDump("got",buffer,i);
  102.     return i;
  103. }

  104. int DECL2 stdwrite(daveInterface * di, char * buffer, int length) {
  105.     unsigned long i;
  106.     if (daveDebug & daveDebugByte)
  107.         _daveDump("I send",buffer,length);
  108. //    EscapeCommFunction(di->fd.rfd, CLRRTS);  // patch from Keith Harris. He says:
  109.                                              //******* this is what microwin does (needed for usb-serial)        
  110.     WriteFile(di->fd.rfd, buffer, length, &i,NULL);
  111. // patch from Andrea. He says:
  112. // In this way the PC Adapter connected to CPU313C hangs waiting for RTS line before answering back.
  113. // Added the following to regain answers:
  114. //    EscapeCommFunction(di->fd.rfd, SETRTS);
  115.     return i;
  116. }
  117. #endif


  118. /*
  119.     Setup a new interface structure from an initialized serial interface's handle and a name.
  120. */
  121. daveInterface * DECL2 daveNewInterface(_daveOSserialType nfd, char * nname, int localMPI, int protocol, int speed){
  122.     daveInterface * di=(daveInterface *) calloc(1, sizeof(daveInterface));
  123. #ifdef DEBUG_CALLS
  124.     LOG7("daveNewInterface(fd.rfd:%d fd.wfd:%d name:%s local MPI:%d protocol:%d PB speed:%d)\n",
  125.         nfd.rfd,nfd.wfd,nname, localMPI, protocol, speed);
  126.     FLUSH;        
  127. #endif        
  128.     if (di) {
  129. //        di->name=nname;
  130.         strncpy(di->realName,nname,20);
  131.         di->name=di->realName;
  132.         di->fd=nfd;
  133.         di->localMPI=localMPI;
  134.         di->protocol=protocol;
  135.         di->timeout=1000000; /* 1 second */
  136.         di->nextConnection=0x14;
  137.         di->speed=speed;
  138.         
  139.         di->getResponse=_daveGetResponseISO_TCP;
  140.         di->ifread=stdread;
  141.         di->ifwrite=stdwrite;
  142.         di->initAdapter=_daveReturnOkDummy;        
  143.         di->connectPLC=_daveReturnOkDummy2;
  144.         di->disconnectPLC=_daveReturnOkDummy2;
  145.         di->disconnectAdapter=_daveReturnOkDummy;        
  146.         di->listReachablePartners=_daveListReachablePartnersDummy;
  147.         switch (protocol) {
  148.             case daveProtoMPI:
  149.                 di->initAdapter=_daveInitAdapterMPI1;
  150.                 di->connectPLC=_daveConnectPLCMPI1;
  151.                 di->disconnectPLC=_daveDisconnectPLCMPI;
  152.                 di->disconnectAdapter=_daveDisconnectAdapterMPI;
  153.                 di->exchange=_daveExchangeMPI;
  154.                 di->sendMessage=_daveSendMessageMPI;
  155.                 di->getResponse=_daveGetResponseMPI;
  156.                 di->listReachablePartners=_daveListReachablePartnersMPI;
  157.                 break;        
  158.                     
  159.             case daveProtoMPI2:
  160.             case daveProtoMPI4:
  161.                 di->initAdapter=_daveInitAdapterMPI2;
  162.                 di->connectPLC=_daveConnectPLCMPI2;
  163.                 di->disconnectPLC=_daveDisconnectPLCMPI;
  164.                 di->disconnectAdapter=_daveDisconnectAdapterMPI;
  165.                 di->exchange=_daveExchangeMPI;
  166.                 di->sendMessage=_daveSendMessageMPI;
  167.                 di->getResponse=_daveGetResponseMPI;
  168.                 di->listReachablePartners=_daveListReachablePartnersMPI;
  169.                 di->nextConnection=0x3;
  170.                 break;
  171.             
  172.             case daveProtoMPI3:
  173.                 di->initAdapter=_daveInitAdapterMPI3;
  174.                 di->connectPLC=_daveConnectPLCMPI3;
  175.                 di->disconnectPLC=_daveDisconnectPLCMPI3;
  176.                 di->disconnectAdapter=_daveDisconnectAdapterMPI3;
  177.                 di->exchange=_daveExchangeMPI3;
  178.                 di->sendMessage=_daveSendMessageMPI3;
  179.                 di->getResponse=_daveGetResponseMPI3;
  180.                 di->listReachablePartners=_daveListReachablePartnersMPI3;
  181.                 di->nextConnection=0x3;
  182.                 break;        

  183.             case daveProtoISOTCP:
  184.             case daveProtoISOTCP243:
  185.                 di->getResponse=_daveGetResponseISO_TCP;
  186.                 di->connectPLC=_daveConnectPLCTCP;
  187.                 di->exchange=_daveExchangeTCP;
  188.                 break;               
  189.                
  190.             case daveProtoPPI:
  191.                 di->getResponse=_daveGetResponsePPI;
  192.                 di->exchange=_daveExchangePPI;
  193.                 di->connectPLC=_daveConnectPLCPPI;
  194.                 di->timeout=150000; /* 0.15 seconds */
  195.                 break;
  196.             case daveProtoMPI_IBH:
  197.                 di->exchange=_daveExchangeIBH;
  198.                 di->connectPLC=_daveConnectPLC_IBH;
  199.                 di->disconnectPLC=_daveDisconnectPLC_IBH;
  200.                 di->sendMessage=_daveSendMessageMPI_IBH;
  201.                 di->getResponse=_daveGetResponseMPI_IBH;
  202.                 di->listReachablePartners=_daveListReachablePartnersMPI_IBH;
  203.                 break;        
  204.             case daveProtoPPI_IBH:
  205.                 di->exchange=_daveExchangePPI_IBH;
  206.                 di->connectPLC=_daveConnectPLCPPI;
  207.                 di->sendMessage=_daveSendMessageMPI_IBH;
  208.                 di->getResponse=_daveGetResponsePPI_IBH;
  209.                 di->listReachablePartners=_daveListReachablePartnersMPI_IBH;
  210.                 break;        
  211.             case daveProtoS7online:
  212.                 di->exchange=_daveExchangeS7online;
  213.                 di->connectPLC=_daveConnectPLCS7online;
  214.                 di->sendMessage=_daveSendMessageS7online;
  215.                 di->getResponse=_daveGetResponseS7online;
  216.                 di->listReachablePartners=_daveListReachablePartnersS7online;
  217.                 di->disconnectPLC=_daveDisconnectPLCS7online;
  218. //                di->disconnectAdapter=_daveDisconnectAdapterS7online;
  219.                 break;               
  220.             case daveProtoAS511:
  221.                 di->connectPLC=_daveConnectPLCAS511;
  222.                 di->disconnectPLC=_daveDisconnectPLCAS511;
  223.                 di->exchange=_daveFakeExchangeAS511;
  224.                 di->sendMessage=_daveFakeExchangeAS511;
  225.                 break;               
  226.             case daveProtoNLpro:
  227.                 di->initAdapter=_daveInitAdapterNLpro;
  228.                 di->connectPLC=_daveConnectPLCNLpro;
  229.                 di->disconnectPLC=_daveDisconnectPLCNLpro;
  230.                 di->disconnectAdapter=_daveDisconnectAdapterNLpro;
  231.                 di->exchange=_daveExchangeNLpro;
  232.                 di->sendMessage=_daveSendMessageNLpro;
  233.                 di->getResponse=_daveGetResponseNLpro;
  234.                 di->listReachablePartners=_daveListReachablePartnersNLpro;
  235.                 break;
  236.         
  237.         }
  238. #ifdef BCCWIN
  239.         setTimeOut(di, di->timeout);
  240. #endif
  241.     }
  242.     return di;        
  243. }

  244. daveInterface * DECL2 davePascalNewInterface(_daveOSserialType* nfd, char * nname, int localMPI, int protocol, int speed){
  245. #ifdef DEBUG_CALLS
  246.     LOG7("davePascalNewInterface(fd.rfd:%d fd.wfd:%d name:%s local MPI:%d protocol:%d PB speed:%d)\n",
  247.         nfd->rfd,nfd->wfd,nname, localMPI, protocol, speed);
  248.     FLUSH;        
  249. #endif        
  250.     return daveNewInterface(*nfd,nname, localMPI, protocol, speed);
  251. }

  252. /*
  253.     debugging:
  254.     set debug level by setting variable daveDebug. Debugging is split into
  255.     several topics. Output goes to stderr.
  256.     The file descriptor is written after the module name, so you may
  257.     distinguish messages from multiple connections.
  258.    
  259.     naming: all stuff begins with dave... to avoid conflicts with other
  260.     namespaces. Things beginning with _dave.. are not intended for
  261.     public use.
  262. */



  263. void DECL2 daveSetDebug(int nDebug) {
  264. #ifdef DEBUG_CALLS
  265.     LOG2("daveSetDebug(%d)\n",nDebug);
  266.     FLUSH;
  267. #endif        
  268.     daveDebug=nDebug;
  269. }

  270. int DECL2 daveGetDebug() {
  271. #ifdef DEBUG_CALLS
  272.     LOG1("daveGetDebug()\n");
  273.     FLUSH;
  274. #endif        
  275.     return daveDebug;
  276. }
  277. /**
  278.     C# interoperability:
  279. **/
  280. void DECL2 daveSetTimeout(daveInterface * di, int tmo) {
  281. #ifdef DEBUG_CALLS
  282.     LOG3("daveSetTimeOut(di:%p, time:%d)\n",        di,tmo);
  283. #endif            
  284.     di->timeout=tmo;
  285. #ifdef BCCWIN
  286.     setTimeOut(di,tmo);
  287. #endif   
  288. }

  289. int DECL2 daveGetTimeout(daveInterface * di) {
  290. #ifdef DEBUG_CALLS
  291.     LOG2("daveGetTimeOut(di:%p)\n",di);
  292.     FLUSH;
  293. #endif            
  294.     return di->timeout;
  295. }

  296. char * DECL2 daveGetName(daveInterface * di) {
  297. #ifdef DEBUG_CALLS
  298.     LOG2("daveGetName(di:%p)\n",di);
  299.     FLUSH;
  300. #endif            
  301.     return di->name;
  302. }


  303. int DECL2 daveGetMPIAdr(daveConnection * dc) {
  304. #ifdef DEBUG_CALLS
  305.     LOG2("daveGetMPIAdr(dc:%p)\n",dc);
  306.     FLUSH;
  307. #endif            
  308.     return dc->MPIAdr;
  309. }

  310. int DECL2 daveGetAnswLen(daveConnection * dc) {
  311. #ifdef DEBUG_CALLS
  312.     LOG2("daveGetAnswLen(dc:%p)\n",dc);
  313.     FLUSH;
  314. #endif            
  315.     return dc->AnswLen;
  316. }

  317. int DECL2 daveGetMaxPDULen(daveConnection * dc) {
  318. #ifdef DEBUG_CALLS
  319.     LOG2("daveGetMaxPDULen(dc:%p)\n",dc);
  320.     FLUSH;
  321. #endif            
  322.     return dc->maxPDUlength;
  323. }

  324. /**
  325.     PDU handling:
  326. **/

  327. /*
  328.     set up the header. Needs valid header pointer
  329. */
  330. void DECL2 _daveInitPDUheader(PDU * p, int type) {
  331.     memset(p->header, 0, sizeof(PDUHeader));
  332.     if (type==2 || type==3)
  333.         p->hlen=12;
  334.     else
  335.         p->hlen=10;
  336.     p->param=p->header+p->hlen;
  337.     ((PDUHeader*)p->header)->P=0x32;
  338.     ((PDUHeader*)p->header)->type=type;
  339.     p->dlen=0;
  340.     p->plen=0;
  341.     p->udlen=0;
  342.     p->data=NULL;
  343.     p->udata=NULL;
  344. }

  345. /*
  346.     add parameters after header, adjust pointer to data.
  347.     needs valid header
  348. */
  349. void DECL2 _daveAddParam(PDU * p,uc * param,us len) {
  350. #ifdef DEBUG_CALLS
  351.     LOG4("_daveAddParam(PDU:%p, param %p, len:%d)\n", p, param, len);
  352.     FLUSH;
  353. #endif
  354.     p->plen=len;
  355. #ifdef DAVE_HAVE_MEMCPY
  356.     memcpy(p->param, param, len);
  357. #else
  358.     int i;
  359.     for (i=0;i<len;i++) p->param[i]=param[i];
  360. #endif
  361.     ((PDUHeader2*)p->header)->plenHi=len/256;
  362.     ((PDUHeader2*)p->header)->plenLo=len%256;
  363. //    ((PDUHeader*)p->header)->plen=daveSwapIed_16(len);
  364.     p->data=p->param+len;
  365.     p->dlen=0;
  366. }

  367. /*
  368.     add data after parameters, set dlen
  369.     needs valid header,parameters
  370. */
  371. void DECL2 _daveAddData(PDU * p,void * data,int len) {
  372. #ifdef DEBUG_CALLS
  373.     LOG4("_daveAddData(PDU:%p, data %p, len:%d)\n", p, data, len);
  374. //    _daveDumpPDU(p);
  375.     FLUSH;
  376. #endif
  377.     uc * dn= p->data+p->dlen;
  378.     p->dlen+=len;
  379. #ifdef DAVE_HAVE_MEMCPY
  380.     memcpy(dn, data, len);
  381. #else
  382.     int i; uc * d=(uc*)data;
  383.     for (i=0;i<len;i++) p->data[p->dlen+i]=d[i];
  384. #endif
  385.     ((PDUHeader2*)p->header)->dlenHi=p->dlen/256;
  386.     ((PDUHeader2*)p->header)->dlenLo=p->dlen%256;
  387. //    ((PDUHeader*)p->header)->dlen=daveSwapIed_16(p->dlen);
  388. }

  389. /*
  390.     add values after value header in data, adjust dlen and data count.
  391.     needs valid header,parameters,data,dlen
  392. */
  393. void DECL2 _daveAddValue(PDU * p,void * data,int len) {
  394.     us dCount;
  395.     uc * dtype;
  396. #ifdef DEBUG_CALLS
  397.     LOG4("_daveAddValue(PDU:%p, data %p, len:%d)\n", p, data, len);
  398.     _daveDumpPDU(p);
  399.     FLUSH;
  400. #endif

  401.     dtype=p->data+p->dlen-4+1;                        /* position of first byte in the 4 byte sequence */

  402.     dCount= p->data[p->dlen-4+2+1];
  403.     dCount+= 256*p->data[p->dlen-4+2];
  404.    
  405.     if (daveDebug & daveDebugPDU)
  406.         LOG2("dCount: %d\n", dCount);
  407.     if (*dtype==4) {        /* bit data, length is in bits */
  408.         dCount+=8*len;
  409.     } else if (*dtype==9) {        /* byte data, length is in bytes */
  410.         dCount+=len;
  411.     } else if (* dtype==3) {        /* bit data, length is in bits */
  412.         dCount+=len;        
  413.     } else {
  414.         if (daveDebug & daveDebugPDU)
  415.             LOG2("unknown data type/length: %d\n", *dtype);
  416.     }            
  417.     if (p->udata==NULL) p->udata=p->data+4;
  418.     p->udlen+=len;        

  419. …………
  420. …………
  421. …………限于本文篇幅 余下代碼請從51黑下載附件…………

復制代碼

所有資料51hei提供下載:
libnodave-0.8.5.rar (3.26 MB, 下載次數: 11)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:394669 發表于 2018-9-6 18:04 | 只看該作者
自己頂
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男人的天堂中文字幕 | 久草视频在线播放 | 97日日碰人人模人人澡分享吧 | 日本黄视频在线观看 | 免费观看一级特黄欧美大片 | 在线免费观看黄色 | 国产精品视频久久 | 久久国产视频网 | 午夜精品一区二区三区在线观看 | 欧美激情综合 | 亚洲精品久久久久久久久久久 | 国产一区二区精品 | 91成人在线视频 | 日韩成人在线播放 | 欧美中文字幕一区二区三区 | 爱爱免费视频 | 亚洲精品视频一区 | 男女性毛片 | а天堂中文最新一区二区三区 | 日韩精品久久一区二区三区 | 99在线免费观看视频 | 亚洲瑟瑟 | www.久久精品视频 | 99久久99热这里只有精品 | 91精品国产一区二区三区 | 亚洲精品视频三区 | 久久久久国产精品www | 天天视频一区二区三区 | 欧美视频 亚洲视频 | 美女131mm久久爽爽免费 | 美女天天操 | 亚洲成在线观看 | 天天躁日日躁狠狠的躁天龙影院 | 在线观看中文字幕视频 | 国产乱xxav | 久久九九影视 | 国产成人精品一区二区在线 | 中文字幕在线观看一区二区 | 成人免费小视频 | a级黄色片在线观看 | 日韩毛片免费看 |