3 .4软plc指令系统设计
3. 4. 1软plc指令的组成
梯形图与指令表是开发plc用户程序使用多的两种编程语言,虽然二者 指令的表达形式不同但表示内容都是由操作码和操作数组成。操作码提供运算的 法则,操作数提供执行运算所需的数据和地址信息。软plc指令是以函数的形 式提供操作码和操作数。
软plc运行系统为每条plc指令编写了相应的指令函数,它们共同组成了 软plc系统的指令库。为了便于以后的扩展和管理,本文在编制软plc指令时 制定了统一的格式。
3. 4. 2软plc指令函数
plc指令分为基本指令和功能指令两类,前者用于对位进行简单的逻辑运 算,是编制plc程序使用的指令;后者主要对字节、字等复杂数据进行处 理完成某种特定的功能。本文在参考标准iec61131-3中梯形图与指令表指 令的基础上,依据simatic s7-300指令系统设计软plc系统的指令函数。
本软plc系统共设计了 25个指令函数,其中基本指令函数16个,功能指 令函数9个。表3-2、3-3分别对每个指令函数进行了说明。
编号
plc指令
指令函数
实现功能
1001
ld
readinbit〇
读输入位状态压入堆栈
1002
ldi
readinbitnot〇
读输入位状态取反压入堆栈
1003
a
readinandbit()
读输入位状态与栈顶元素进行逻辑“与”运算,然 后压入堆栈
1004
ai
readinandbitnot()
读输入位状态取反后与栈顶元素进行逻辑“与”运 算,然后压入堆栈
1005
0
readinorbit()
读输入位状态与栈顶元素进行逻辑“或”运算,然 后压入堆栈
1006
01
readinorbitnot()
读输入位状态取反后与栈顶元素进行逻辑“或”运 算,然后压入堆栈
1007
outbit
writeoutbit〇
将逻辑堆栈栈顶元素状态写到对应输出地址位
1008
not
logicnot〇
将逻辑堆栈栈顶元素状态取反后压入堆栈
1009
s
setbit〇
将对应的输入输出位状态置“1”
1010
r
resetbit()
将对应的输入输出位状态置“0”
1011
copypush
c〇py()
将逻辑堆栈栈顶元素复制到第二个栈中
1012
pop
releasepop()
释放逻辑堆栈栈顶元素
1013
anb
andstack〇
将两个堆栈栈顶元素进行逻辑“与”运算
1014
orb
orstack()
将两个堆栈栈顶元素进行逻辑“或”运算
1015
copytofirst
copytofirst〇
将逻辑堆栈栈顶两个元素进行“与”运算
1016
clr
clearstackq
清空逻辑堆栈中的所有元素
编号
plc指令
指令函数
实现功能
1017
band
logicandbyte〇
将两个字节的数值进行逻辑“与”运算
1018
wand
logicandword()
将两个字的数值进行逻辑“与”运算
1019
bor
logicorbyte()
将两个字节的数值进行逻辑“或”运算
1020
wor
logicorbyte()
将两个字的数值进行逻辑“或”运算
1021
comparebyte
comparedbyteld(); comparedbyteand〇 ; comparedbyteor〇 ;
将两个字节的数值进行比较 将比较结果压入逻辑堆栈;
将比较结果与栈顶元素进行逻辑“与”运算; 将比较结果与栈顶元素进行逻辑“或”运算; 比较运算符:==、>、<、>=、<=、!=
1022
compareword
c ompare dwor dld (); comparedwordand〇 ; comparedwordor();
将两个字的数值进行比较 将比较结果压入栈顶;
将比较结果与栈顶元素进行逻辑“与”运算; 将比较结果与栈顶元素进行逻辑“或”运算; 比较运算符:==、>、<、>=、<=、!=
1023
move
movebyte(); move word(); moved word〇 ;
按字节赋值 按字赋值 按双字赋值
1024
timer
timer
定时功能:用于设定输出信号的延迟时间, 当延迟时间到达到所设定的值时能流通过
1025
counter
counter
计数功能:用于对脉冲信号进行计数,当脉 冲数等于所设定值时能流通过
下面以基本指令函数readlnbitg和功能指令函数counter为例,说明他 们的具体实现:
(1) readinbit()
读输入位指的指令之一,当软plc系统执行ld指令时会调用 readinbit〇函数。首先它按照参数访问i/o存储区域,通过字节号查询到该位软 元件所在的单元地址,然后查找位号读取该位当前状态,将其压入逻辑堆栈。具 体实现代码如下:
readinbit(char channel [no])
{bool bitno =false; //清 “0”
readbit(channel[no], bitno); //读取操作数(位)状态
pb—stackarea ->push(bitno); //压入逻辑堆栈
(2) counter
西门子plc计数器按计数方式的不同分为:加计数器、减计数器以及加/减 计数器。本文counter采用递减方式计数,当当前值减为“0”时计数器完成 计数功能。梯形图指令中的计数器如图3.9所示。
软plc为counter类分配了存储区域m_counterarea[]来保存计数器的 预设倌和状杰信息。计数器执行函数的运行流稈如图3.9所示。当计数器的状杰 位curcondition[0]=false (可计数状态)且reset=0时,检测到上升沿脉冲信号 输入时,计数器的当前值m_curvalue减1。当m_curvalue= 0时计数标志位置 “1”,完成计数。若curcondition[0]=true(不可计数状态),则以预设值m_pv 初始化计数器,并使计数标志位置“0”,未完成计数。 计数器功能的实现代码如下:
{ int bitno =(c_no%8-l); //确定软兀件所在位号 char flagc=0x01;
if(curcondition[0]==true) //判断计数器的状态 {if(lastcondition[l]== true)
{ m_curvalue=m_pv; } //计数器值复位 flagc=!(0x01« bitno);
m_counterarea[c_no/8]&=flagc;// 计数标志位置 “0”
}
else //可计数状态
{ if((m_curvalue!=0)&&(!lastcondition[l])&&curcondition[l]) {m_cur value--;}//有上升沿脉冲信号输入计数值自减
if(m_curvalue==〇y/判断计数器的当前值
{
flagc=! (0x01« bitno);
m_counterarea[c_n〇 /8]卜 flagc; //完成计数功能
}
else
{
flagc=!(0x01« bitno);
m_counterarea[c_no/8]&= flagc;//未完成计数功能
}
}
}
3. 4. 3软plc指令的寻址
(1)软plc指令寻址格式
软plc指令函数是通过寻址函数获取操作数及其地址信息的。对于简单数 据软plc运行系统提供按位(bit)、字节(byte)的寻址方式,对于复杂数据按 字(w)、双字(dw)方式进行寻址。寻址时首先数据存储区域,接着存储 的输入、输出标识,后所在字、字节以及位地址。例如:寻址“li4.3” 表示对应i/o端子的数据存储在本地通讯存储区的输入映像区,其中“l”代表 数据的存储区域,“i”代表存储在输入映像寄存区,“4”代表数据所在字节编号, 表示取位操作符,“3”代表所取元素所在字节中的位号。
由于cpu —次至少能处理8位,所以对于按字节、字、双字寻址,软plc
米用了头部寻址加尾部寻址的统一寻址格式。编址格式见图3.12。米用统一寻址 可避免因外部i/o采集装置的改变而对用户程序的接口函数进行修改,通过寻址 能够智能获取数据。图3.13给出了软plc按字节的寻址方式。
r \
区域标识符
输入输出标识符
寻址类型
字节编号
(l,r, t,a,p,c)
(i,q)
(b,w,dw)
15 0
参数信息:
l,r,t,a,p,c分别为plc数据在内存中的存储区域
i-输入映像区q-输出映像区
b-按字节寻址w-按字寻址dw-按双字寻址
(2)软plc指令寻址函数实现
每种寻址方式都有对应的寻址函数,如:按位寻址函数readbitg、按字节 寻址函数readbyte〇、按字寻址函数readword(),它们共同完成向plc指令函 数提供操作数的任务。按位寻址函数readbitg的部分实现代码如下:
{ char * chr_point;
chr_point=strchr(address,将指针指向字符串中所在位号 switch(address[0]) //判断软逻辑存储区域
{case 'l':
switch(address「ll) //判断输入还是输出映像区 { case t:
currentbitstatus(m sercosbuffer.m sercostoplcbuffer.m ulsercostopl
c[atoi(address+2)],atoi(chr_point+l),bitbool);
break;
case 'q':
…}
currentbitstatus(unsigned char channelno, int bitno,bool &bitstatus) //判断当前 输入位状态
{ char flagbit=0x01; flagbit «=bitno;
if((flagbit & channelno) == flagbit)//判断当前位状态是否为 “ 1 ” bitstatus =tme; else
bitstatus =false;
}
3. 5本章小结
本章通过分析软plc运行系统的工作原理,划分了软plc运行系统的任务 组成,给出了各模块的执行流程图以及部分实现代码,结合直接方式和间接方式 调度的优点实现了软plc系统多任务之间的调度,并对软plc存储系统、指令 系统以及寻址方式进行了设计,给出了典型的基本指令和功能指令的实现函数, 基本上实现了软plc运行系统的功能。
本文采摘自“五轴数控加工中心软plc控制系统的研究”,因为编辑困难导致有些函数、表格、图片、内容无法显示,有需要者可以在网络中查找相关文章!本文由伯特利数控整理发表文章均来自网络仅供学习参考,转载请注明!