PMAC应用四-plc程序
创建一个PLC程序
创建程序
几个注意的点
在PLC中启动modbus通讯
PLC中启用Modbus服务
PMAC ModbusTcp数据读取与写入
HMI通过ModbusTcp读取和写入PMAC变量
用程序实现信号的上升下降沿
Ecat自启动和延时程序
Ecat自启动程序
延时函数
结后语
创建一个PLC程序
创建程序
项目文件下打开PMAC Script Language文件夹,右击PLC Programs文件夹添加一个PLC文件。
基本结构:
IDE自动分配一个与这个命名程序对应的内部编号,从1开始。当启动(使用enable plc命令)或列出程序的内容(使用list plc命令)时,你可以在任何地方使用它。最多可以创建32个PLC程序,编号从0到31。
程序的逻辑编写很简单,类c语言,我贴一些官网的案例。
while:
while(Input1 == 0) {} // Pause here until Machine Input 1 goes high
while(Input2 == 1)
{
Counter++; // Increment Counter while Input2 is 1
}
if:
if(Input1 == 0) // If Machine Input 1 is low
{
Output1 = 0; // Set Output 1 low
}
else
{
Output1 = 1; // Set Output 1 high
}
switch:
switch(MachineState)
{
case 0:
// action1
break;
case 1:
// action2
break;
default:
// action3
break;
}
几个注意的点
如果一个PLC是启用的,PLC的执行是自动启动在适当的时间在实时中断(RTI)或后台周期。
从数字0开始,多达4个程序可以运行在前台的实时中断里,Sys.MaxRtPlc指定要实时运行的最高编号的PLC,PLC0默认总是在实时终端里。
启用PLC可在终端输入 enable plc +plc编号或名字。e.g. enable plc 1 enable plc MyPLC
在程序里使用终端命令。
open plc MyPLC
// --------------------User Code Goes Here------------------------
cmd"要使用的终端命令"
cmd"#1j/" //1号电机上电
cmd“enable plc 1” //启用plc1
cmd"Motor[1].AmpEna" //查询1号电机上电状态
close
- 在pp_startup.txt启动plc程序(此文件中启动的plc,PMAC上电,系统启动后plc自动启用)
enable plc 1 //启用plc1
enable 3..5 //启用plc3到5
在PLC中启动modbus通讯
PLC中启用Modbus服务
open plc MyPLC
// --------------------User Code Goes Here------------------------
if (Sys.ModbusServerEnable==0) //判断服务时候启用
{Sys.ModbusServerEnable=1;}
close
开启服务后,在HMI上配置好pmac的ip地址,以威纶通的触摸屏为例。
注意数据需要转换
PMAC ModbusTcp数据读取与写入
在Libraries文件夹下新建一个名为ReadModbusBit的函数,代码如下:
///从HMI读数据//
open subprog ReadModbusBit(ModbusAddress, &Output)
local BufferNo,BitNo;
ModbusAddress=ModbusAddress-1;
BufferNo=int(ModbusAddress / 8);
BitNo=ModbusAddress % 8;
Output=(Sys.ModbusServerBuffer[BufferNo]>>BitNo) & 1;
close
再新建一个名为WriteModbusBit的函数,代码如下:
/往HMI写数据
open subprog WriteModbusBit(ModbusAddress,Input)
local BufferNo,BitNo;
ModbusAddress=ModbusAddress-1;
BufferNo=int(ModbusAddress / 8);
BitNo=ModbusAddress % 8;
if (Input==1)
{
Sys.ModbusServerBuffer[BufferNo]|=1<<BitNo;
}
else
{
Sys.ModbusServerBuffer[BufferNo] &= Sys.ModbusServerBuffer[BufferNo] ^(1<<BitNo);
}
close
在plc程序里使用
open plc MyPLC
// --------------------User Code Goes Here------------------------
if (Sys.ModbusServerEnable==0) //判断服务时候启用
{Sys.ModbusServerEnable=1;}
call ReadModbusBit(1,&TestReadModbus) //将HMI的按键读到TestReadModbus变量,PMAC中需要定义TestReadModbus变量
call WriteModbusBit(10,Motor[1].AmpEna) //将PMAC的Motor[1].AmpEna参数写到bit10,再在HMI显示出来
close
触摸屏上的按键设置:
触摸屏上的显示小灯设置:
HMI通过ModbusTcp读取和写入PMAC变量
PMAC变量与ModbusTcp的转换
文档上分别说明了I、M、P、Q这四种变量的转换,我使用M变量来演示。
plc程序:
//M130=2*130+16384+2
M130=Motor[1].JogSpeed*1000;
这样就能把ModbusTcp的地址和PMAC的地址对应上,读取和写入一样对的,只要在HMI上设置成可输入。
特别要注意设备之间大小端的问题。
用程序实现信号的上升下降沿
在PMAC中用程序实现信号的上升沿和下降沿。
上升沿函数:
/****************************************/
//上升沿触发 FCInput1为输入,FCInput2及FCOutput1为同一个全局变量做中间变量,FCOutput2为输出脉冲
/****************************************/
open subprog UpTrigFC(FCInput1,FCInput2,&FCOutput1,&FCOutput2)
if (FCInput1==0 && FCInput2==0)
{FCOutput1=0;FCOutput2=0;}
if (FCInput1==1 && FCInput2==0)
{FCOutput1=1;FCOutput2=1;}
if (FCInput1==0 && FCInput2==1)
{FCOutput1=0;FCOutput2=0;}
if (FCInput1==1 && FCInput2==1)
{FCOutput1=1;FCOutput2=0;}
close
下降沿函数:
/****************************************/
//下降沿触发 FCInput1为输入,FCInput2及FCOutput1为同一个全局变量做中间变量,FCOutput2为输出脉冲
/****************************************/
open subprog DownTrigFC(FCInput1,FCInput2,&FCOutput1,&FCOutput2)
if (FCInput1==0 && FCInput2==0)
{FCOutput1=0;FCOutput2=0;}
if (FCInput1==1 && FCInput2==0)
{FCOutput1=1;FCOutput2=0;}
if (FCInput1==0 && FCInput2==1)
{FCOutput1=0;FCOutput2=1;}
if (FCInput1==1 && FCInput2==1)
{FCOutput1=1;FCOutput2=0;}
close
使用方法:首先定义一组变量
global plus,plus0,plus1;
在plc中使用
call ReadModbusBit(1,&plus)
call UpTrigFC(plus,plus0,&plus0,&plus1)
call DownTrigFC(plus,plus0,&plus0,&plus1)
if(ManualPower1==1)
{
m1=m1+1; //按钮按下m1加1
}
if(plus1==1)
{
m2=m2+1; //松开按钮m1减1
}
Ecat自启动和延时程序
Ecat自启动程序
open plc 1
// --------------------User Code Goes Here------------------------
call Timer(1)
if (ECAT[0].Enable==0)
{ECAT[0].Enable=1;}
else
{disable plc 2;}
close
使用时要在pp_startup启用该plc程序。
延时函数
/**********************************************/
// 功 能: 延时函数,单位:秒
/**********************************************/
open subprog Timer(delay_times)
local EndTime;
EndTime = Sys.Time + delay_times;
while(EndTime>Sys.Time){};
return;
close
结后语
这一节中出现了很多子程序,子程序的具体介绍可以看培训文档,我这不做介绍,使用ModbusTcp一定要注意设备之间大小端的问题。下一节讲讲运动学。
评论(0)
您还未登录,请登录后发表或查看评论