Power PMAC與上位機的Modbus通信
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的使用基本教程結束,《工程實踐例程》有時間再更,不明白的可以一起探討。