玉帝和王母是什么关系| 永垂不朽的垂是什么意思| 为什么人会得抑郁症| 利多卡因是什么| 贫血是什么原因引起的| 八月份是什么季节| 痛风有什么不能吃| 十二指肠炎吃什么药| 晚上入睡困难是什么原因| 高压低是什么原因引起的| 属虎五行属什么| 牙齿出血是什么病表现出来的症状| 玫瑰代表什么| w是什么意思| 什么居什么业| 真谛是什么意思| 老汉推车是什么意思| 珠五行属什么| 防晒衣什么颜色最防晒| 洋姜学名叫什么| 桑葚泡水喝有什么功效| smart什么牌子| 什么来什么去| 吃花生有什么好处| 乳房旁边疼是什么原因| dr是什么| 检查是否怀孕要挂什么科| 肝胃郁热吃什么中成药| 奶油是什么做的| 女人梦到蝎子什么征兆| 姜枣茶什么季节喝最好| 4月8日是什么星座| 内心孤独的人缺少什么| 五行大林木是什么意思| 父母都是a型血孩子是什么血型| 介入超声是什么意思| 发量多的女生适合什么发型| George是什么意思| 女人排卵期有什么反应| 50pcs是什么意思| 投递是什么意思| 头疼恶心是什么症状| 腺体鳞化是什么意思| 5月19号是什么星座| 眼睛痛是什么原因| 吃什么食物对肠胃好| 坐享其成是什么意思| 徐州有什么好吃的美食| 青春痘长什么样| 霜降吃什么| 屁多且臭是什么原因| 80属什么| 小苏打和食用碱有什么区别| 伤口发炎吃什么消炎药| 什么情况下会得荨麻疹| 头疼吃什么药最有效| 教师编制是什么意思| 小狗感冒了吃什么药| 幽门螺旋杆菌阳性是什么意思| 达泊西汀有什么副作用| 88属什么生肖| 蚕长什么样| 米醋和陈醋有什么区别| 1月17号是什么星座| 低血糖看什么科室| 头发为什么会掉| 玉米须加什么治痛风| 微信号为什么会封号| 儿童补锌吃什么| 神经是什么意思| 血脂高吃什么中药| 达人是什么意思| 倒灌是什么意思| 肺部真菌感染用什么药最好| 典韦字什么| 连长相当于地方什么官| 磁力链接是什么| 阅兵什么意思| 牛油果是什么味道| 犯花痴什么意思| 三月20号是什么星座| 神经大条是什么意思| hpv是什么原因引起的| 3月19是什么星座| longines是什么牌子| 冰妹是什么意思| 睡觉身上痒是什么原因| aj是什么意思| 1994年五行属什么| 甲状腺不能吃什么| 为什么会有| 鹅厂是什么意思| 小孩脱发是什么原因引起的| 为什么白天能看到月亮| 表面抗原阳性是什么意思| 大便很黄是什么原因| 为什么会有高血压| 滞留是什么意思| 暗无天日是什么意思| 桑黄长在什么树上| 补血吃什么水果| 我宣你 是什么意思| 2月2日什么星座| 吃中药不能吃什么水果| 盘尼西林是什么药| 垂髫是什么意思| 吃什么快速排便| 黑洞到底是什么| 霸王花煲汤放什么材料| 水蛭怕什么| 翡翠的五行属性是什么| 竹节虫吃什么| 9月3日是什么星座的| 空腹不能吃什么水果| 社保卡是干什么用的| 胸腔积液挂什么科| 为什么怀孕了还会来月经| 今天吃什么| 贯众是什么植物| 1月19号什么星座| 胳膊上种花是什么疫苗| 私密瘙痒是什么原因| 男人到了什么年龄就性功能下降| 咳嗽痰多用什么药| 容易静电的人说明什么| 什么是干冰| 什么运动长高最快| 绿松石是什么| 荷塘月色是什么菜| 风热感冒是什么意思| 不10是什么意思| 中暑吃什么药见效快| 血糖高是什么引起的| 什么叫法令纹| 天然是什么意思| 西皮是什么皮| 游离脂肪酸是什么| 什么树没有叶| 经期吃什么好| 打一个喷嚏代表什么意思| 黑曜石是什么| 农历五月二十一是什么星座| 无后为大的前一句是什么| 化疗为什么掉头发| 耳朵为什么老是痒| 天蓝色配什么颜色| 网球ad是什么意思| 加特纳菌阳性是什么病| 农历五月二十四是什么星座| 风水宝地是什么生肖| 牙疼吃什么食物能缓解| 聚聚什么意思| 保肝护肝吃什么| 已读不回是什么意思| 为什么精子射不出来| 黄芪加陈皮有什么功效| 同房疼痛什么原因| 可颂是什么意思| 甲减对胎儿有什么影响| 掉头发是什么原因引起的| 乳香是什么东西| 不由自主的摇头是什么病| 开业需要准备什么东西| 失足是什么意思| 抵押是什么意思| 旅行的意义是什么| 失眠为什么开奥氮平片| 麒麟臂什么意思| 刘强东开什么车| 子宫位于腹部什么位置| 什么动物有四个胃| 梦见打老婆是什么预兆| 属相牛和什么属相配| 便秘灌肠用什么水| 牵强是什么意思| 超细旦是什么面料| 女人出黄汗是什么原因| 爱情公寓6什么时候上映| 宇宙是什么意思| 老八是什么意思| 潜叶蝇打什么药效果好| 补肾壮阳吃什么药效果好| 支气管炎吃什么消炎药| 心率90左右意味着什么| 为什么来月经会头疼| 戈谢病是什么病| 夫复何求是什么意思| 感冒咳嗽可以吃什么水果| 一根长寿眉预示什么| 引体向上练什么肌肉| rem睡眠是什么意思| 医生为什么穿白大褂| 心慌是什么病| kiki是什么意思| 舌炎吃什么药好得快| 芹菜和西芹有什么区别| 00年属什么生肖| 心里烦躁是什么原因| 聊表心意什么意思| 福建人喜欢吃什么| 梦见生小孩是什么征兆| 奇经八脉指的是什么| 礼拜是什么意思| 耳鸣用什么滴耳液| amount是什么意思| 鸡血藤有什么功效| 大唐集团什么级别| 黑豆不能和什么一起吃| 吃什么壮阳补肾| 老是叹气是什么原因| 左手中指麻木是什么原因| 梦见怀孕流产是什么意思| m2是什么意思啊| 视力矫正是什么意思| 小揪揪什么意思| 男人有霉菌是什么症状| 复辟什么意思| 脑梗吃什么好| 芡实有什么功效| 什么军官可以随身配枪| ys是什么意思| 书的五行属性是什么| 惗是什么意思| 胎儿肾积水是什么原因引起的| 吃什么变白| 精干是什么意思| 包皮属于什么科| winbond是什么品牌| 儿童肠胃炎吃什么药| 入坑是什么意思| 81年五行属什么| ab型血为什么容易得精神病| 做免疫组化意味什么| 胃炎挂什么科| 润是什么生肖| 氨酚咖那敏片是什么药| 脾胃虚弱吃什么中成药| quest是什么车| 霉菌用什么药| 血镁偏高是什么原因| 钠是什么东西| 鼻子上火是什么原因引起的| 近亲结婚生的孩子会得什么病| 橡皮擦是什么材料做的| 腱鞘炎是什么| 草字头加全念什么| 鸡皮肤用什么药膏最好| 甲硝唑的副作用是什么| 掼蛋是什么意思| 包皮开裂是什么原因| 天丝是什么材料| 梅长苏结局是什么| negative什么意思| 炙是什么意思| 梦见涨大水是什么意思| 20是什么生肖| 肺气肿是什么病严重吗| 女人吃猪肝有什么好处| 绿皮鸡蛋是什么品种鸡| 3个火读什么| 莹是什么意思| 15岁可以做什么兼职| 腰椎生理曲度变直什么意思| 蝉为什么要脱壳| 百度
工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->综合电路图->综合电路图->计算机与PLC的通讯格式和实现方法

乡村教育守望者张玉滚:扎根深山十七载 把山路走成通天大道-新闻人物-时政频道-中工网

发布人:fanxiaoxi 时间:2025-08-04 收藏
百度 这次,张弥曼女士获颁的联合国教科文组织世界杰出女科学家成就奖,是首次授予古生物学家,这对中国的古生物学发展,甚至对全世界的古生物学领域来说,都有深远意义。

计算机与PLC的通讯格式和实现方法

本文简要介绍了PLC编程数据口的操作命令格式及其VC++语言实现通讯方法,并给出了四类操作的VC++语言实现,为监控和管理PLC的运行提供了一种良好的方法。

关键词:PLC;编程口;串口通讯;VC++语言

一、引言

可编程序控制器(PLC)都有一个编程口。以日本三菱公司生产的PLC为例(包括FX系列和A系列),其编程口为RS-422格式,根据PLC型号不同又分为8针座编程口和25针座编程口。对于后者,可直接将SC—08编程电缆将PLC的编程口和微型计算机的RS—232口连接起来;对于后者,则还需要一根转换电缆将PLC 的8针座编程口和25针编程电缆相连。无论何种情况,一旦将PLC用户程序由微型计算机编程环境传到PLC 用户程序区,其编程口大多就没有被再利用。其实,这是一种浪费。也就是说,可利用此编程口实现微型计算机和PLC 的数据通讯,将PLC的工作状态纳入微型计算机管理之下。

二、编程口操作命令类型与通讯端口初始化

串行通讯是计算机与其它机器之间进行通讯的一种常用方法,在WINDOWS操作系统中提供了实现各种串行通讯的API函数。通过SC—08编程电缆或FX232AW模块,可将微型计算机的串行通讯口RS—232和PLC 的编程口连接起来,这样微型计算机就可对PLC的RAM区数据进行读、写操作。由PLC本身所具有的特性,可对PLC进行以下四种类型的操作:
  (1)位元件或字元件状态读操作(CMD0);
  (2)位元件或字元件状态写操作(CMD1);
  (3)位元件强制ON操作(CMD7);
  (4)位元件强制OFF操作(CMD8)。
  另外,在进行上述四类操作以前,首先要对端口进行初始化操作,即设定通讯协议(包括设置通讯波特率、数据位数、数据停止位及奇偶校验)。在WINDOWS的SDK中定义了一个结构DCB,该结构详细地说明了如何对通讯端口进行控制,所以通讯端口的初始化也是围绕着对这个结构的正确设置为中心进行的。用VC++语言实现端口初始化如下:
  BOOL CSerial::Open(int nPort)
{
  //nPort 为微型计算机串行通讯口端口号。nport=1为端口1;nPort=2为端口2。
  char szPort\[15\];
  DCB dob;
  m_hIDComDev=CreateFile(szPort, GENERIC_READ│GENERIC_WRITE,O,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL│FILE_FLAG_OVERLAPPED,NULL);
  dcb.DCB1ength=sizeof(DCB);
  GetCommState(m_hIDComDev,&dcb);//取得通讯资源当前设置
  dcb.BaudRate=9600;//设定波特率为9600
  dcb.ByteSize=7;//7数据位
  dcb.Parity=2;//偶校验
  dcb.StopBits=0;//设定1个停止位
  if(SetCommState(m_hIDComDev,&dcb)return(TRUE);
  else return(FALSE);//设置端口,若设置成功则返回TRUE,否则返回FALSE

  需要说明的是CSerial是一个用于串行通讯的类,它包含了进行串行通讯的所需的函数。除上述端口初始化成员函数Open外,还包括另两个重要成员函数:一个是endData,把数据从一个缓冲区发送到串行端口。另一个是ReadData,从端口的接收缓冲区中读入数据。
  其次,在每进行一次上述四类操作中的一种操作以前,还要进行握手联络。对PLC发请求讯号ENQ(代码为OX05),然后读PLC 的响应讯号。如果读到的响应讯号为ACK(代码为OX06),则表示PLC已准备就绪,等待接收通讯数据。握手联络VC++语言示PLC已准备就绪,等待接收通讯数据。握手联络VC++语言实现为:
BOOL CNTJD1g::ReadFromPLC(char *Read_char char *Read_address,int Read_bytes)
{
  CSerial Serial;//用于串行通讯的类
  char read_BUFFER;
  if(Serial.Open(2)//初始化串行口通讯口COM2
  { Serial.SendData(&ENQ_request,1);//发送联络讯号
   Sleep(1000);//等待1秒钟
   Serial.ReadData(&read_BUFFER,1);//读取PLC响应讯号
  if(read_BUFFER==ACK)
  { 如果PLC响应讯号等于ACK,则进行上述四种操作:}}
  Serial.Close()://操作完毕后,关闭通讯口
}

三、编程口命令操作

  (1)位元件或字元件状态读操作
  操作对象元件:PLC内部的X、Y、M、S、T、C、D元件;命令格式:

说明:①为读命令起始标志STX,代码为OX02;
   ②为位元件或字元件状态读命令CMDO,命令代码为OX30;
   ③为读位元件或字元件的4位起始地址,高位先发,低位后发,且是以ASCII码的形式发送;
   ④为一次读取位元件或字元件的个数,最多一次可读取OXff个字节的元件,以ASCII码的形式发送;
   ⑤为停止位标志ETX,代码为OX03;
   ⑥为2位和校验,和累计为②、③、④项代码,取其和最低两位转化成ASCII码,高位先发,低位后发。
  在发送完上述命令格式代码后,就可直接读取PLC响应的信息。响应信息格式如下:

  VC++语言实现:
  BOOL CNTJDlg::ReadFromPLC(char *Read_char char
*Read_address, int Read_bytes)
{
  char senddatasum_CHECK\[2\];char readdatasum_CHECK\[2\]; char total_DATABYTES\[2\];
  char readdatasum_check\[2\];int readdata_sum;
  int datasum_check=0;  int i;
  Serial.SendData(&STX_start,1);/向PLC发送“开始”标志代码
  Serial.SendData(&CMDO_read,1);//发送“读”命令代码datasum_check+=CMDO_read;
  for(i=0;i<4;i++){Serial.SendData(&Read_address\[i\],1);//发送起始元件地址的ASCII代码datasum_check+=Read_address\[i\];}
  Change to ASCII(total DATABYTES,Read_bytes);//将字节数转化成ASCII代码
  for (i=0;i<2;i++){Serial.SendData(&total_DATABYTES\[i\],1);//发送元件字节数的ASCII代码)datasum_check+total_DATABYTES\[i\];}
  Serial.SendData(&ETX_end,1);//发送“结束”标志代码senddatasum_CHECK+ETX_end;
  Change_to_ASCII(senddatasum_CHECK,senddatasum_CHECK);//将“和”转化成ASCII码
  for (i=0;i<2;i++) Serial.SendData(&senddatasum_CHECK\[i\],1);
  Sleep(1000);//等待PLC响应
  Serial.ReadData(&read_BUFFER,1);
  if(read_BUFFER==STX_start){
    readdata_sum=0;
    for(i=0;i<2*Read_bytes;i++){Serial.ReadData(&Read_char\[i\],1);//读Read_bytes个字节readdata_sum+Read_char\[i\];}
    Serial.ReadData(&read_BUFFER,1);
    if(read_BUFFER==ETX_end){Serial.ReadData(readdatasum_CHECK,2);//读入的“和”的低2位ASCII码Readdata_sum+=ETX_end;}
   Change_to_ASCII(readdatasum_check,readdata_sum);//将计算得到的“和”转化成ASCII码
   if(*readdatasum_CHECK==*readdatasum_check)//“和”校验
  { AfxMessageBox(“数据读出成功!”)return TRUE;}
   else { AfxMessageBox(“校验错误”)return FALSE.}
}
  (2)位元件或字元件状态写操作
  操作对象元件:同3(1);命令格式:

说明:①为写命令起始标志STX,代码为OX02;
   ②为位元件或字元件状态写命令CMD1,命令代码为OX31;
   ③为写位元件或字元件的4位起始地址,高位先发,低位后发,且是以ASCII码的形式发送;
   ④为一次写入位元件或字元件的个数,以ASCII码的形式发送;
   ⑤为待写到PLC RAM区的数据DATA,以ASCII码形式发送;
   ⑥为停止位标志ETX,代码为OX03;
   ⑦为2位和校验,和累计为②、③、④项代码,取其和最低两位转化成ASCII码,高位先发,低位后发。
  VC++语言实现:
  BOOL CNTJDlg::WritePLC(char *data_ADDRESS,char *Write_ASC,int bytesnumber)
  {
   char total_BYTES\[2\];char senddatasum_CHECK\[2\];
   char read_BUFFER;char read_finishBUFFER;
   int datasum_check=0; int i=0;
   Serial.SendData(&STX_start,1);//向PLC发送“开始”标志代码
   datasum_check=0;Serial.SendData(&CMD1_write,1);//发送“写”命令代码
   datasum_check+CMD1_write;
   for(i=0;i<4;i++) {Serial.SendData(&data_ADDRESS\[i\],1);//发送起始元件地址的ASCII码
   datasum_check+=data_ADDRESS\[i\];
    Change_to_ASCII(total_DATABYTES,bytesnumber);//将字节数转化成ASCII码
  for(i=0;i<2;i++)
  {
   Serial.SendData(&total_BYTES\,1);//发送元件字节数的ASCII代码
   datasum_check+=total_BYTES\[i\];}
   for {i=0;i<bytesnumber*2;i++)
  {
   Serial.SendData(&Write_ASC\[i\],1);//发送要写入的数据的ASCII码
   datasum_check+=Write_ASC\[i\];}
   Serial.SendData(&ETX_end,1);//发送“结束”标志代码
   datasum_check+=ETX_end;
   Change_to_ASCII(senddatasum_CHECK,datasum_check);//将“和”转化成ASCII码
   Serial.SendData(&senddatasum_CHECK,2);
  Sleep(1000); Serial.ReadData(&read_finishBUFFER,1);
   if (read_finishBUFFER==ACK_reply)
  {AfxMessageBox(“数据写入 OK”)return TRUE;}
  else {AfxMessageBox(“数据写入失败”)return FALSE。}
  (3)位元件强制ON操作
  操作对象:X、Y、M、S、T、C元件;
  命令格式:

说明:①为强制ON命令起始标志STX,代码为OX02;
   ②为强制ON命令CMD7,命令代码为OX37;
   ③为强制ON位元件4位起始地址,高位先发,低位后发,是以ASCII码形式发送;
   ④为停止位标志ETX, 代码为OX03;
   ⑤为2位和校验,和累计为②、③、④项代码,取其和低两位转化成ASCII码,高位先发,低位后发。
  VC++语言实现:
  void NTJDlg::ForceOnOperation (char *ON_Address)
  { int i;
   char│syn_Check\[2\];
   char read_buffer;
   int Sum=0;
   Serial.SendData(&STX_start,1);//向PLC发送“开始”标志代码
   Serial.SendData(&CMD7_ForceON,1);//发送“ON”命令代码
   Sum+=CMD7 ForceON;
   for (i=0; i<4; i++) {Serial.SendData(&ON_Address\[i\],1)//发送起始元件地址的ASCII码
   Sum+=ON_Address\[i\];}
   Serial.SendData(&ETX_end,1);//发送“结束”标志代码Sum+=ETX_end;
   Change_to_ASCII(Sum_Check,Sum);//将“和”转化成ASCII码
   Serial.SendData(&Sum_Check,2);
   Sleep(1000);
   Serial.ReadData(&read_buffer,1);
   if(read_finishBUFFER==ACK_reply) AfxMessageBox(“ON 操作 OK”);
   else AfxMessageBox(“ON 操作失败”)。
  }
  (4)位元件强制OFF操作
  操作对象L同3(3);命令格式:

说明:①为强制OFF命令起始标志STX,代码为OX02;
   ②为强制OFF命令CMD8,命令代码为OX38H;
   ③为强制OFF位元件4位起始地址,高位先发,低位后发,以ASCII码形式发送;
   ④为停止位标志ETX,代码为OX03;
   ⑤为2位和校验,和累计为②、③、④项代码,取其和最低两位转化成ASCII码,高位先发,低位后发。
  VC++语言实现:
  void NTJDlg::ForceOffOperation (char *OFF_Address)
  {
  int i;
  char Sum_Check\[2\];
  char read_buffer;
  int Sum=0;
  Serial.SendData(&STX_start,1);//向PLC发送“开始”标志代码
  Serial.SendData(&CMD8_ForceOFF,1);//发送“OFF”命令代码
  Sum=CMD8_ForceOFF;
  for (i=0;i<4;i++) {
   Serial.SendData(&OFF_Address\[i\],1);//发送起始元件地址的ASCII码
   Sum+=OFF_Address\[i\];}
  Serial.SendData(&ETX_end,1);//发送“结束”标志代码
  Sum+=ETX_end;
  Change_to_ASCII(Sum_Check,Sum);//将“和”转化成ASCII码
  Serial.SendData(&Sum_Check,2);
  Skeeo(1000);
  Serial.ReadData(&read_buffer,1);
  if(read_fininhBUFFER==ACK_reply) AfxMessageBox(“OFF 操作 OK ”);
  else AfxMessageBox(“OFF 操作失败”)。
  }
  注意:必须严格按照上述四种操作命令格式进行发送,在发送前,起始地址、数据、数据个数、校验和都必须按位转换成ASCII码。从PLC读到的数据亦是ASCII码形式,需要经过适当转换才能利用。另外,要注意强制命令地址与读写地址的顺序不是一样,且一次最多只能传送64个字节数据。

四、结论

  利用上述四种操作命令,就可对PLC的RAM区数据进行管理操作。将PLC的工作状态纳入微型计算机管理之下。在此基础上,用户可以应用VC很方便地设计自己的PLC人机接口界面,为监控与管理PLC的运行提供一种良好的方法。


关键词: plc

评论

技术专区

低血压吃什么好 h是什么元素 客单价什么意思 虎头蛇尾是什么意思 子弟是什么意思
什么药可以延长射精 知我者非你也什么意思 少尉是什么级别 耳朵发热是什么预兆 维生素b2吃多了有什么副作用
两个吉念什么 天体是什么意思 白佛言是什么意思 工事是什么意思 gi值是什么意思
边界欠清是什么意思 甲状腺3类是什么意思 骨骼惊奇什么意思 心动过速吃什么药 什么的菜地
圈癣是什么引起的hcv9jop8ns0r.cn 什么汤降火hebeidezhi.com 在下是什么意思hcv9jop2ns6r.cn 双龙戏珠是什么意思ff14chat.com 路上行人匆匆过是什么歌hcv9jop8ns2r.cn
ctp是什么意思hcv9jop0ns4r.cn 中校是什么级别hcv8jop5ns7r.cn 怀孕甲减对孩子有什么影响hebeidezhi.com 湘潭市花是什么xscnpatent.com 减肥应该吃什么主食hcv9jop0ns5r.cn
宝宝嘴巴臭臭的是什么原因hcv8jop2ns3r.cn 公安局属于什么机关hcv8jop5ns9r.cn 一饿就胃疼什么原因hcv7jop6ns7r.cn 痛风反复发作什么原因hcv9jop2ns8r.cn 微白蛋白高是什么情况hcv8jop2ns8r.cn
下午1点是什么时辰hcv8jop8ns6r.cn 血糖高看什么科室hcv8jop1ns9r.cn 老气横秋是什么意思helloaicloud.com 备孕喝苏打水什么作用luyiluode.com 神采什么什么hcv8jop5ns7r.cn
百度