Power PMAC運動控制器 —— 學習筆記6

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章