PMAC与Modbus主站进行Modbus Tcp通讯
创建modbus通讯参数
在项目的PMAC Script Language\Global Includes下创建一个名为00_Modbus_Para.pmh的pmh文件。
Modbus[0].Config.ServerPort = 0
Modbus[0].Config.ConnectTimeOut = 6000
Modbus[0].Config.SendRecvTimeOut = 0
Modbus[0].Config.ServerIpAddr[0]=127
Modbus[0].Config.ServerIpAddr[1]=0
Modbus[0].Config.ServerIpAddr[2]=0
Modbus[0].Config.ServerIpAddr[3]=1
Sys.ModbusServerEnable = 1;
具体的参数查看手册,样例使用的是本机的回环地址。
创建modbus 后台C程序
在C Language\Background Programs下添加一个后台C应用程序,名为capp1。在capp1文件夹下创建一个capp1.c的source文件。
int main(void)
{
struct timespec sleeptime = {0};
sleeptime.tv_nsec = NANO_10MSEC; // #defines NANO_5MSEC & NANO_10MSEC are available
InitLibrary(); // Required for accessing Power PMAC library
//modbus client 使用socket0 连接到 Server
ModbusConnect(0);
//自定义读写 float数据
float wdata[5] = {0,0,0,0,0};3
float rdata[5] = {0,0,0,0,0};
//开始连续执行,若要退出 p110=0
pshm->P[110] = 1;
while(pshm->P[110])
{
//P变量赋值到要写入的变量
wdata[0] = (float)pshm->P[0];
wdata[1] = (float)pshm->P[1];
wdata[2] = (float)pshm->P[2];
wdata[3] = (float)pshm->P[3];
wdata[4] = (float)pshm->P[4];
//modbus float write
ModbusFloatWrite(0,0,5,wdata);
//modbus float read
ModbusFloatRead(0,0,5,rdata);
//读取的变量赋值到P变量
pshm->P[100] = rdata[0];
pshm->P[101] = rdata[1];
pshm->P[102] = rdata[2];
pshm->P[103] = rdata[3];
pshm->P[104] = rdata[4];
//执行一次sleep 10ms
nanosleep(&sleeptime,NULL);
}
//断开modbus 连接
ModbusClose(0);
CloseLibrary();
return 0;
}
创建启动程序
在PMAC Script Language\PLC Programs文件夹下创建一个plc1.plc程序。
//延时启动c app
call Timer.msec(500)
system "/var/ftp/usrflash/Project/C\ Language/Background\ Programs/capp1.out"
disable plc 1
运行
右击项目选择构建并下载项目,下载完成后终端发送save保存到控制器。
在Watch界面上查看sys.ModbusServerThreads值是否是1。
添加监控数据p0,5和p100,5
在终端输入enable plc 1,启动plc程序。
在终端输入p0=1,2,3,4,5
在终端中输入p110=0退出连续执行
在终端中输入p0=0,p100的值并不会变化,并且sys.ModbusServerThreads变成了0.
终端再启用plc1程序后
watch界面数据更新,p100值为0。