让找料更便捷
电子元器件
采购信息平台
生意随身带
随时随地找货
一站式电子元器件
采购平台
半导体行业观察第一站
标签:
摘要: 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) 单击“确定”按钮,开始发送数据,这里对发送的数据进行了相应的处理,
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,‘#’);
s.setat(1,n);
s.setat(2,uppervalue);
s.setat(3,lowervalue);
s.setat(4,verify(n,uppervalue,lowervalue));
s.setat(5,‘*’);
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缓冲区格式
数据缓冲区的第一个数据指明了接收的字节数。下面是部分程序,
……
//端口初始化
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
……
//处理接收数据的中断程序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 |