电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 华强电子网公众号

    电子元器件

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

用VC++实现与S7-226 PLC与上位机的通信

来源:-- 作者:-- 浏览:545

标签:

摘要: 1 引言   将pc机与可编程控制器组合起来,充分利用pc机强大的人机接口功能、丰富的应用软件和低廉的价格来共同实现管理、控制一体化成为一个新的发展趋势。pc 机和可编程控制器之间的互联通讯,是实现管理、控制一体化的技术关键。   vc++是现今最复杂,但是也是功能最强大的一种windows应用程序开发工具,在图形处理和数据库管理等方面具有较强的功能,这对要求实时性比较高的生产现场显得尤为重要。如

  1 引言

  将pc机与可编程控制器组合起来,充分利用pc机强大的人机接口功能、丰富的应用软件和低廉的价格来共同实现管理、控制一体化成为一个新的发展趋势。pc 机和可编程控制器之间的互联通讯,是实现管理、控制一体化的技术关键。

  vc++是现今最复杂,但是也是功能最强大的一种windows应用程序开发工具,在图形处理和数据库管理等方面具有较强的功能,这对要求实时性比较高的生产现场显得尤为重要。如何利用vc++开发串行通讯程序来实现pc机和plc之间的实时通讯成为了一个难点。

  锌液流量控制系统由二级计算机系统构成。上位机为一台工控机ipc610,根据产量要求对加入8座铅塔的粗锌液流量进行设定、监视和记录。下位机为8套西 门子公司的s7-226型号的plc。在上位机输入给定流量值,将数据从上位机传送到plc,实现二者之间的通讯。系统结构框图如图1所示。

  2 上位机的通信编程

  上位机可以采用事件驱动方式或查询方式处理和下位机的数据通讯。

  (1) 事件驱动方式

  通讯控件属性sthreshold和rthreshold,设置产生发送或接收中断,在通讯事件处理程序中根据事件属性commevent做相应处理,适用于定长数据块的传送。

  (2) 查询方式

  查询方式实质上也是事件驱动,但在有些情况下,这种方式更加便捷。在程序的每个关键功能以后,可以通过检查commevent属性的值来查询事件和错误。 如果应用程序较小,并且是自保持的,这种方法更可取。我们这里的这个程序就是利用这种方式来实现的。

  图1 系统结构框图

  这里我们利用了vc++6.0提供的通讯控件mscomm编写出所需的串行通信程序,该控件用到了一系列的属性和用户接口,用户用get…函数得到属性的当前值,用set…函数设置属性值。

  现在开始编写上位机的通信程序:

  a) 首先打开vc++6.0,建立一个基于对话框的工程,在对话框中添加如附表中列出的控件:

  b) oninitdialog()函数中添加初始化串口参数的代码

  bool csetvaluedlg::oninitdialog()

  { …….

  m_comm.setcommport(1); // 选择com2

  if(!m_comm。getportopen())

  m_comm.setportopen(true); //打开串口

  //设置9600波特率,8位数据位,无校验,1 //位停止位

  m_comm.setsettings(“9600,n,8,1”);

  m_comm.setinputmode(1); //置为二进制输入 //方式

  m_comm.setinputlen(0); //设置为在读操作 //时读取接收缓冲区中的所有数据

  // 设置为发送缓冲区每发送一个字符引发一次oncomm事件

  m_comm.setsthreshold(1);

  ……

  }

c) 上位机到plc的数据帧格式

  ip data1 data2 v *

  其中‘#’为开始标志符。

  ip 为plc节点标识符,用来指定和上位机通信的plc节点号。

  data1和data2为两个字节的通信数据。

  v为1个字节的帧校验码,它是 从开始标志符‘#’到数据字节结束的所有字符的ascii码按位异或的结果。

  ‘*’表示数据帧结束。

  下面就是数据校验的函数,

  int csetvaluedlg::verify(int number, int upper, int low)

  {

  int a[4],b=0;

  a[0]=‘#’;

  a[1]=number;

  a[2]=upper;

  a[3]=low;

  for(int i=0;i<4;i++)

  b=a[i]^b;

  return b;

  }

  其中 number为plc的节点号,upper为data1,low为data2。

  d) 单击&ldquo;确定&rdquo;按钮,开始发送数据,这里对发送的数据进行了相应的处理,

  void csetvaluedlg::onbtnok()

  {

  updatedata(true);

  int n,digital,uppervalue,lowervalue;

  float setvalue;

  n=m_cmbno。getcursel()+1;

  setvalue=m_fsetvalue;

  digital=(int)((setvalue-16.0)*4000/(24.0-16.0));

  //digital为输入值对应的12位数字量

  uppervalue=(int)(digital/64);

  //uppervalue为digital的高6位数字量

  lowervalue=digital-uppervalue*64;

  //lowervalue为digital的低6位数字量

  cbytearray s;

  s。removeall();

  s.setsize(6);

  s.setat(0,&lsquo;#&rsquo;);

  s.setat(1,n);

  s.setat(2,uppervalue);

  s.setat(3,lowervalue);

  s.setat(4,verify(n,uppervalue,lowervalue));

  s.setat(5,&lsquo;*&rsquo;);

  m_comm.setoutput(colevariant(s));

  }

 3 plc的通信程序

  s7-226型plc通信模式有两种:一种是点对点(ppi)通信协议,另一种是对用户完全开放的自由端口(free port)模式。后者比较常用。所谓自由端口模式就是cpu的串行通讯口可由用户程序控制。只有当cpu处于run模式,才可以进行自由端口通讯。在进行 通信以前首先要对串口进行初始化,smb30和smb130用来分别配置通讯端口0和1,为自由端口通讯选择波特率,奇偶校验和数据位数。

  可以用rcv指令方便地接收信息。rcv指令可以接收一个或多个字符,最多有255个字符的缓冲区,这些字符存储在缓冲区中。如果有一个中断程序连接到接收完成事件上,在接收到缓冲区中的最后一个字符时,则会产生一个中断(对端口0为中断事件23,对端口1为中断事件24)。

  rcv tbl,port激活初始化或结束接收信息的服务。通过指定端口(port)接收的信息存储于数据缓冲区(tbl)。rcv缓冲区的格式如图2所示。

  图2 rcv缓冲区格式

  数据缓冲区的第一个数据指明了接收的字节数。下面是部分程序,

  &hellip;&hellip;

  //端口初始化

  movb 16#09, smb130

  //选定串口1,初始化自由口,选择9600波特率,

  //8位数据位,无校验

  movb 16#b0, smb187 //初始化rcv信息控

  //制信息

  movb 42, smb189 //设定信息结束信息为42(`*`)

  movb 10, smb194 //设定最大字符数为10

  atch int_1, 24 //接收完成事件接到中断1

  eni //允许用户中断

  rcv vb100, 1 //端口1的接收信箱缓冲区

  //指向vb100

  &hellip;&hellip;

  //处理接收数据的中断程序1

  ld sm0.0

  movw +0, vw200

  movw +0, vw202

  bti vb103, vw202 //vb103为高6位数字量

  movw +64, vw200

  *i vw202, vw200

  bti vb104, vw202 //vb104为低6位数字量

  +i vw202, vw200

  movw vw200, vw100 //结果存vw100单元

  creti //中断返回

  4 结论

  本文利用vc++6.0开发了的串口通讯程序,充分利用了plc和上位机本身资源的优势实现二者的通信。上述方法和程序已经成功地应用于某冶炼厂的锌精馏 过程锌液流量计算机控制系统中,实际运行情况表明,这种通信方法简单、稳定、可靠,到达了预期的效果。

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67