CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  网络通信/分布式开发

做个PLC通信方面的请进

楼主xxw19820907(文)2006-07-04 14:43:28 在 Delphi / 网络通信/分布式开发 提问

大家好!  
    请哪位有DELPHI跟PLC与仪表通信的源码,如果有相关资料也行,如果分不够,我会再给的,在等待中、、、 问题点数:100、回复次数:11Top

1 楼xxw19820907(文)回复于 2006-07-05 08:38:42 得分 0

怎么没人做个吗,有谁做个,就请你告诉我吧,我先谢谢啦Top

2 楼postren(小虫【宝宝出生,真忙】)回复于 2006-07-05 08:48:15 得分 0

一般都是串口通信Top

3 楼xxw19820907(文)回复于 2006-07-05 10:38:55 得分 0

UP、、、Top

4 楼xxw19820907(文)回复于 2006-07-05 15:39:06 得分 0

upTop

5 楼xxw19820907(文)回复于 2006-07-07 07:49:19 得分 0

upTop

6 楼vividw(vividw)回复于 2006-07-07 09:25:51 得分 0

plc看型号了   摸过段时间     看接口   和协议   串口   rs232   网口   ==     协议不过一般都是保密的。。  
   
  有的   plc也提供想过的软件接口  
   
  Top

7 楼QQgenie(妖魔鬼怪)回复于 2006-07-07 09:32:32 得分 0

卖plc的都有卖软件的呀,搞个盗版用用也行!  
   
  你的是?型号Top

8 楼keiy()回复于 2006-07-07 09:44:09 得分 0

每个PLC厂家,都有不同的通讯协议,一般用RS232且在PLC厂家的说明书中都有  
  我以前做过华光的,在delphi下用的是VARIAN   ASYNC32   COMPONENT   控件  
  有些厂家还会提供开发包,最好与你PLC家商联系Top

9 楼xxw19820907(文)回复于 2006-07-07 13:08:49 得分 0

我是用DELPHI 跟 S7-200通信Top

10 楼keiy()回复于 2006-07-07 20:02:53 得分 0

我找到了99年我用BCB写的与PLC通讯的一段程序,供参考(BCB很容易转成delphi的,其中   mycomm为VARIAN   ASYNC32   COMPONENT   控件)  
  --------------------------------------------------------------------------------  
  #define   ENQ   0x05  
  #define   SOH   0x01  
  #define   ETB   0x17  
  #define   STX   0x02  
  #define   ACK   0x06  
  #define   NAK   0x15  
  #define   ETX   0x03  
  #define   EOT   0x04  
   
  struct     S_SOH   {  
      char   soh;  
      char   pcno[2];     //   子局号  
      char   direct;   //方向  
      char   func;     //功能  
      char   addr[4];   //地址  
      char   datalen[4];   //数据量  
      char   mainno[2];     //主局号  
      char   etb;  
      char   lrc;  
  }   mys   =   {  
                    SOH,  
                    {'0','1'},       //   PLC   no  
                    '0',         //   dircct  
                    '0',         //   function  
                    {   '0','0','0','0'   },     //   address  
                    {   '0','0','0','0'   },     //   len  
                    {'0','1'   },                       //   computer   no  
                    ETB,                                     //etb  
                    0                                           //lrc  
  }     ;  
   
  bool   commreadstat=true;  
  bool   curcommstat=false;  
  bool   begcommstat=false;  
  TForm   *curform;  
  char   callid[]={0x4e,0x21,5};  
  readplcdata(char   func,char   *addr,char   *datalen,  
                                              unsigned   char   *destbuff)  
  {  
        unsigned   char   buff[40];  
        int   i,Count,len,rellen;  
        char   *p;  
   
        try   {  
  //     send   hand   signal  
                    mycomm->Write(callid,3);  
  //   get   PLC   ack  
                    Count=3;  
                    commtimeout->Enabled=true;  
                    while(commreadstat   &&   ((len=mycomm->Read(buff,Count))<=0))  
                              Application->ProcessMessages();  
                    commtimeout->Enabled=false;  
                    if   (!commreadstat)  
                          throw   -1;  
                    if   (!(len==3   &&   buff[0]=='N'   &&   buff[1]==0x21   &&   buff[2]==0x06))  
                          throw   -1;  
  //   begin   to   read   data  
  //   send   SOH  
                    mys.direct='0';         //read  
                    mys.func=func;  
                    mys.addr[0]=addr[0];  
                    mys.addr[1]=addr[1];  
                    mys.addr[2]=addr[2];  
                    mys.addr[3]=addr[3];  
                    mys.datalen[0]=datalen[0];  
                    mys.datalen[1]=datalen[1];  
                    mys.datalen[2]=datalen[2];  
                    mys.datalen[3]=datalen[3];  
                    mys.lrc=0;  
                    p   =   (char   *)&mys;  
                    for(i=1;i<=14;i++)  
                          mys.lrc   ^=   *(p+i);  
                    mycomm->Write(p,17);  
  //   get   PLC   ack  
                    Count=1;  
                    commtimeout->Enabled=true;  
                    while(commreadstat   &&   ((len=mycomm->Read(buff,Count))<=0))  
                              Application->ProcessMessages();  
                    commtimeout->Enabled=false;  
                    if   ((!commreadstat)   ||   (buff[0]!=ACK))  
                          throw   -1;  
  //   get   PLC   data  
                    rellen=StrToInt((String)"0x"+datalen);  
   
                    Count=30;  
                    commtimeout->Enabled=true;  
                    while(commreadstat   &&   ((len=mycomm->Read(buff,Count))<=0))  
                              Application->ProcessMessages();  
                    commtimeout->Enabled=false;  
                    if   (!commreadstat   ||   (buff[0]!=STX))  
                          throw   -1;  
                    rellen=StrToInt((String)"0x"+datalen);  
                    i=1;  
                    if   (rellen<=len-3)  
                          memmove(destbuff,buff+1,len-3);  
                          else  
                              {  
                                    rellen-=(len-1);     //   ingrno   STX  
                                    memmove(destbuff,buff+1,len-1);  
                                    destbuff+=(len-1);  
                                    while(rellen>7)  
                                          {  
                                                i++;  
                                                Count=30;  
                                                commtimeout->Enabled=true;  
                                                while(commreadstat   &&   ((len=mycomm->Read(buff,Count))<=0))  
                                                        Application->ProcessMessages();  
                                                commtimeout->Enabled=false;  
                                                if   (!commreadstat)  
                                                      throw   -1;  
                                                rellen-=len;  
                                                memmove(destbuff,buff,len);  
                                                destbuff+=len;  
                                            }  
                                        Count=6;  
                                        commtimeout->Enabled=true;  
                                        while(commreadstat   &&   ((len=mycomm->Read(buff,Count))<=0))  
                                                  Application->ProcessMessages();  
                                        commtimeout->Enabled=false;  
                                        if   (!commreadstat)  
                                                throw   -1;  
                                        memmove(destbuff,buff,rellen);  
                              }  
   
  //   send   ACK   to   PLC  
                    buff[0]=ACK;  
                    mycomm->Write(buff,1);  
  //   get   EOT   from   PLC  
                    Count=1;  
                    commtimeout->Enabled=true;  
                    while(commreadstat   &&   ((len=mycomm->Read(buff,Count))<=0))  
                              Application->ProcessMessages();  
                    commtimeout->Enabled=false;  
                    if   ((!commreadstat)   ||   (buff[0]!=EOT))  
                          throw   -1;  
  //   send   EOT   to   PLC  
                    mycomm->Write(buff,1);  
                    return   true;  
      }Top

11 楼vividw(vividw)回复于 2006-07-10 08:35:19 得分 0

S7-200     可以用   rs232方式   或者用西门子提供的软件  
  还有是否   plc用了   其他通讯   模块Top

相关问题

关键词

得分解答快速导航

  • 帖主:xxw19820907

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo