Power PMAC与上位机的Modbus通信
1. 启动modbus服务器
2. 用户共享内存缓冲区变量说明
3. 读取和发送数据
3.1 发送数据
3.2 读取数据
4. EtherCAT网络的使能
声明
1. 启动modbus服务器
将以下程序写入全局变量文件中,建议新建一个单独的文件modbus.pmh文件来存放以下代码:

/**********************************************/
// 作 用:  设置Modbus服务器的通信IP及ID号
//  @     Jack Soong
// Time:  2019.02.21
/**********************************************/
Modbus[0].Config.ServerPort = 0 // (默认Modbus port 502)
//超时设置
Modbus[0].Config.ConnectTimeOut = 6000 // 0, defaults to OS timeout, minimum = 5200 msec timeout)
Modbus[0].Config.SendRecvTimeOut = 0 // 0, defaults to 6300 msec timeout 5 of 6 Retransmissions)

Modbus[0].Config.UnitID = 4 //与Modbus消息一起发送的单元ID,如果Modbus设备只有一个,可不用
																				// 设置服务器IP为192.168.0.200
Modbus[0].Config.ServerIpAddr[0]=192
Modbus[0].Config.ServerIpAddr[1]=168
Modbus[0].Config.ServerIpAddr[2]=0
Modbus[0].Config.ServerIpAddr[3]=200

Sys.ModbusServerEnable = 1  // 使能modbus服务器

2. 用户共享内存缓冲区变量说明

请查看手册《Power PMAC Users Manual》P493、P494

在这里插入图片描述

用户共享内存缓冲区数据结构如下表所示(重要!!!):

在这里插入图片描述

其中Cdata可表示byte型数据,Udata可表示无符号int型数据,Idata可表示int型数据,Fdata可表示float型数据,Ddata可表示double型数据。

以上数据结构表示的仅仅是一种读取内存数据的方式,实际上在内存中存储的数据都是01表示的二进制,举例说明:Udata[100]、Idata[100]、Fdata[100]读取的是同一块内存区100,只不过是通过不同的数据类型读的而已。

3. 读取和发送数据
读取和发送数据都要通过PMAC的ModbusServerBuffer缓存器来实现,一个Buffer缓存器是8bit,即对应上表中的一个Cdata。
在这里插入图片描述

上图中,↑↓表示对应的读取和发送数据,应避免上位机和PMAC同时向同一块缓存区中发送数据。

ModbusServerBuffer序号是从0开始的,即第一个缓存器为Sys.ModbusServerBuffer[0]

每个buffer代表什么意思需要由写上位机程序员和PMAC程序开发者两位工程师共同商讨,即确定通讯的协议内容。

注意,数据的读取和发送会涉及Modbus通信的字序问题和数据的存储问题,不懂的请参考博文《基础笔记3 —— 关于大小端数据存储方式的转换及测试说明》、《数据类型在内存中的存储》。

3.1 发送数据
比较简单,直接给Buffer缓存器赋值即可。

// 浮点数的发送
Sys.Fdata[200] = 178.35
Sys.ModbusServerBuffer[4] = (Sys.Udata[200] & 16711680) >> 16
Sys.ModbusServerBuffer[5] = (Sys.Udata[200] & 4278190080) >> 24
Sys.ModbusServerBuffer[6] = (Sys.Udata[200] & 255)
Sys.ModbusServerBuffer[7] = (Sys.Udata[200] & 65280) >> 8

// 符号整型数据的发送
Sys.Idata[200] = 100
Sys.ModbusServerBuffer[0] = (Sys.Udata[200] & 16711680) >> 16
Sys.ModbusServerBuffer[1] = (Sys.Udata[200] & 4278190080) >> 24
Sys.ModbusServerBuffer[2] = (Sys.Udata[200] & 255)
Sys.ModbusServerBuffer[3] = (Sys.Udata[200] & 65280) >> 8

// 标志位的发送
statu1 = 1
statu2 = 0
statu3 = 0
statu4 = 1
statu5 = 1
statu6 = 0
Sys.Cdata[0] = (statu1<<7) | (statu2<<6) | (statu3<<5) | (statu4<<4) | (statu5<<3) | (statu6<<2); 
Sys.ModbusServerBuffer[1] = Sys.Cdata[0];

需要注意,由于设备的不同,Modbus缓存器读取的起始位可能为0,也可能为1,使用的时候需要测试/确认一下。

3.2 读取数据

// float数据的接收
Sys.udata[100] = (Sys.ModbusServerBuffer[0]<<16)|(Sys.ModbusServerBuffer[1]<<24)|Sys.ModbusServerBuffer[2]|(Sys.ModbusServerBuffer[3]<<8)
x_val = Sys.Fdata[100];

// int数据的接收
Sys.udata[100] = (Sys.ModbusServerBuffer[0]<<16)|(Sys.ModbusServerBuffer[1]<<24)|Sys.ModbusServerBuffer[2]|(Sys.ModbusServerBuffer[3]<<8)
x_val = Sys.Idata[100];

// bit数据的接收
Sys.udata[100] = (Sys.ModbusServerBuffer[0]<<16)|(Sys.ModbusServerBuffer[1]<<24)|Sys.ModbusServerBuffer[2]|(Sys.ModbusServerBuffer[3]<<8)
statu1 = Sys.Idata[100]>>31;

4. EtherCAT网络的使能

使用以下cmd命令来实现

ECAT[0].Enable = 1

通常我们希望其在PMAC一上电就使能,即在PLC程序中实现,那么在初始化PLC中我们可以写入以下代码:

cmd"ECAT[0].Enable = 1"		//激活EtherCAT

如果实现连接失败后的重连动作,可用以下代码实现:

// @ Jack Soon
	cmd"ECAT[0].Enable = 1"		//激活EtherCAT
	call Timer(15)				//延时15秒等待EtherCAT连接
	if(ECAT[0].Enable == 0)      //如果EtherCAT连接失败,重置EtherCAT,继续连接,否则发送错误代码
	{	
		
		cmd"ecat reset"
		call Timer(5)
		cmd"ECAT[0].Enable = 1"
		call Timer(15)
		if(ECAT[0].Enable == 0)
		{
			Ecat_error=1;
		}
	}
	else
	{
		Ecat_error=0;
	}

声明

  • 手册中的截图,版权归欧姆龙所有,本人在此声明引用。

至此,Power PMAC的使用基本教程结束,《工程实践例程》有时间再更,不明白的可以一起探讨。