PMAC应用四-plc程序
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<
在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变量来演示。
M n = n × 2 + 16384 + 2 Mn=n\times 2+16384+2 Mn=n×2+16384+2
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一定要注意设备之间大小端的问题。下一节讲讲运动学。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
