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一定要注意设备之间大小端的问题。下一节讲讲运动学。