上位機開發——Modbus聯合運動控制卡實時通訊
阿新 • • 發佈:2022-05-06
前言
最近有運動控制的學員問到這樣的問題,能不能通過Modbus協議,實現運動控制卡的資料讀取。
經過測試,切實可行。這裡採用的是正運動的ECI1408板卡,其他品牌板卡可能不支援,具體諮詢供應商。
MOdbus協議
正運動控制器支援兩個儲存區,分別是0區和4區。
- 0區從地址10000開始與輸入 IN 口對應。
- 0區從地址20000開始與輸出 OUT 口對應。
- 4區從地址10000開始對應軸 DPOS 區間。
- 4區從地址11000開始對應軸 MPOS 區間。
- 4區從地址12000開始對應軸 VP_SPEED 區間。
- 4區從地址13000開始對應模擬量DA輸出區間。
- 4區從地址14000開始對應模擬量AD輸入區間。
- 對於其他引數,可以採用自定義儲存區0-7999來使用。
-
程式碼測試
這裡以讀取XYZ三軸的位置來進行測試。
- 建立連線
//Modbus通訊物件
private ModbusTcp modbusTcp = new ModbusTcp();
//取消執行緒源
private CancellationTokenSource cts;
private void btn_Connect_Click(object sender, EventArgs e)
{
if (modbusTcp.Connect(this.txt_IPAddress.Text, Convert.ToInt32(this.txt_Port.Text)))
{
//如果連線成功,開執行緒讀取
cts = new CancellationTokenSource();
Task.Run(() =>
{
GetMotionData();
}, cts.Token);
}
else
{
MessageBox.Show("運動控制卡連線失敗", "建立連線");
}
}
- 斷開連線
private void btn_DisConn_Click(object sender, EventArgs e)
{
cts?.Cancel();
modbusTcp.DisConnect();
}
- 多執行緒讀取解析
private void GetMotionData()
{
while (!cts.IsCancellationRequested)
{
byte[] res = modbusTcp.ReadKeepReg(1, 10000, 6);
this.Invoke(new Action(() =>
{
if (res != null && res.Length == 12)
{
float[] values = FloatLib.GetFloatArrayFromByteArray(res, DataFormat.CDAB);
this.lbl_XAxis.Text = values[0].ToString();
this.lbl_YAxis.Text = values[1].ToString();
this.lbl_ZAxis.Text = values[2].ToString();
}
}));
}
}
- 測試結果如下:
上位機軟體實時資料顯示:
測試軟體結果顯示:
整體總結
本案例主要是測試了基於Modbus協議來讀取運動控制卡的相關引數,這種情況主要用於第三方軟體需要運動控制系統的相關資料。同時,如果後續的運動控制專案,需要提供資料給其他軟體,可以將運動控制卡作為一個現成免費的ModbusTCP伺服器,不僅可以傳遞運動控制引數,其他引數都可以實現傳遞。