施耐德EAE 之所以稱為開放自動化,其中一個重要的特征就是它提供了軟體運行時(Soft dPAC),而且不僅提供了Windows 版本的Soft dPAC,還提供Linux版本的運行時,Linux版本運行時實作了容器化(docker),在Alpine OS 環境的容器中運行,并且分別支持X86 處理器和Arm hf 處理器,這意味著軟體dPAC 既可以在X86 linux 上運行,也可以在大多數Arm 計算設備上運行,比如樹莓PI,瑞芯微RK3399 或者全志H6,NXP i.mx 系列產品,這是令人興奮的事情,為第三方自動化軟硬體提供了一個入口,
另一方面,Soft dAPC 還提供了Modbus TCP和TCP/UDP 方式和其它應用程式交換資料,
本文介紹Linux 作業系統下的Soft dPAC 的安裝,使用,以及通過modbus TCP和TCP/UDP 與外部程式交換資料,
背景資料
EcoStruxure Automation Expert的三層架構
施耐德的EcoStruxure Automation Expert(簡稱為 EAE),是一個自動化平臺,他們稱之為軟體為中心的工業自動化,EAE具有三層架構,從底層的PLC,變頻器,傳感器到邊緣控制的軟體dPAC ,到頂層的應用,分析和服務,

EcoStruxure Automation Expert基本組成

軟體dPAC 的特性
EcoStruxure Automation Expert軟體dPAC 是先進的多平臺 IEC61499 為基礎的控制運行時,它包括:
- 基于事件,網路透明的自動化能力
- 原生程序告警支持
- modbus/TCP 客戶端和服務器
- OPC UA 服務器
- Ethernet/IP (在v20.2 中支持有限平臺
EcoStruxure Automation Expert軟體dPAC 在一個標準PC 上使能一個開放,靈活,可擴展,高度集成IEC61499 運行時,從低成本的嵌入式系統到高性能IT 服務器,
運行時在工業邊緣提供了集成和運行先進IT 工具,程式庫和應用的開放平臺,這是通過TCP/UDP socket 和直接鏈接DLL 庫的方式實作的,
這個公共運行時集成硬體解決方案,比如Altivar 變頻器,Modicon M251 dPAC, Modicon M580 dPAC,加上linux 系統上基于容器的虛擬軟體運行時,
EcoStruxure Automation Expert的Linux軟體dPAC 兼容實時Linux內核,并且支持每臺機器上多個運行時同時運行,它們通過modbus/TCP 和Ethernet/IP 通信,
軟體dPAC 的運行環境

由此可見,Linux 下的運行時有兩個版本:
- X86-64 版本是 Intel X86 下的版本
- Arm HF 版本 是 32 位Arm 版本,arm hf arm hard float 的簡寫,
這就意味著Soft dPAC 不僅能夠在Intel X86 計算機上運行,也可以在Arm 嵌入式平臺上運行,比如樹莓PI 4,RK3399 ,H6 等Arm 板上運行,
Soft dPAC 要求在docker 容器中運行,施耐德提供的是一個docker 容器的image,直接可以在docker 中安裝成為容器運行,
這是一件令人興奮的事情,我們可以在各種邊緣計算機上部署Soft dPAC, 甚至可以將它們部署在云端,和其它微服務協同操作,構建一個開發性系統,
構建邊緣計算架構
有了docker 版本的Soft dPAC ,就可以將它部署到邊緣服務器上面,并且與docker 容器中的其它微服務協同操作,下面是一個典型的架構圖:

前面提到,Soft dPAC 提供了3種方式與外部程式互動
- 動態庫 DLL 直接呼叫
- modbus TCP
- TCP/UDP 方式,
docker 容器中程式以微服務的方式運行,所有的微服務通過一個統一的訊息系統實作訊息交換,比如RabbitMQ ,MQTT 等,為此,我們要設計一個Soft Gateway 程式將Soft dPAC TCP 傳輸的資料轉換成微服務訊息,通過message bus 資訊交換,在這里我們選擇簡單MQTT 作為訊息總線,
測驗程序
安裝
解壓
解壓出EAE V20.2 后有一個檔案,這就是Linux 版本Soft dPAC 的壓縮包:
tar zxvf ./softdpac.tar
安裝image
sudo python3 install.py
啟動容器運行
按照檔案中的提示是運行startSoftdPAC.sh
sudo sh startSoftdPAC.sh --ipbase 192.168.31.95 --itname enp1s0 --image-name softdpac:x86-v20.2-20315-1064 --nbcontainer 1
不過具體程序中發現 docker 的埠51499 沒有暴露除了來, 直接使用物理埠IP 地址也不是很好,可以使用docker 的方式直接安裝,我采用 portainer 基于web 的容器管理工具,

modbus/TCP 通信
在EAE 中,有一個 Modbus Software Gateway ,可以實作與外部modbus TCP server 的通信,這就可以連接第三方的遠程IO模塊,也可以連接其它的應用程式,

在EAE 中,modbus 是作為硬體功能塊來實作的,需要在device List 視窗中,指定設備擊右鍵選擇 HW Configuration.

出現下面視窗,選擇 Standard.IoModbus.MODBUS .

于是在HW Configuration 中出現MODBUS 專案,
下一步,在MODBUS 埠添加 設備,在MODBUS 下擊右鍵,出現下面視窗,選擇MODBUSGENTCPS,

添加的MODBUSGENTCPS 相當于Slave MODBUS 設備,它內部的讀寫暫存器在一個XML 中定義,比如modbusmap.xml,如下面所示
最后還需要添加一個Standard.IoModbus.MODBUSSLAVEND .(不要忘記,我就是忘了,一直搞不通)
<?xml version="1.0" encoding="utf-8"?>
<MBInterface>
<var name="VAL_OUT1" type="UINT" offset="0" usage="write" comment="VAL_OUT1" />
<var name="VAL_OUT2" type="UINT" offset="1" usage="write" comment="VAL_OUT2" />
<var name="VAL_IN1" type="UINT" offset="0" usage="read" comment="VAL_IN1" />
<var name="VAL_IN2" type="UINT" offset="1" usage="read" comment="VAL_IN2" />
</MBInterface>
該檔案可以存盤在Project 檔案夾中,下一步指向MODBUSGENTCPS1 擊右鍵,選擇Modbus Gateway,彈出一個檔案選擇視窗,選擇 modbusmap.xml.

經過上面一系列添加之后,HW Configuration 是這樣的:

我們還需要設定上面視窗中所有專案的屬性(property),它們包括:
- MODBUS,
- MODBUSGENTCPS1,
- VAL_OUT1_MODBUSGENTCPS1
- VAL_OUT2_MODBUSGENTCPS1
- VAL_IN1_MODBUSGENTCPS1
- VAL_IN2_MODBUSGENTCPS1
下面是相關專案的屬性視窗,
MODBUS屬性

MODBUSGENTCPS1 屬性

VAL_OUT1_MODBUSGENTCPS1 /VAL_OUT2_MODBUSGENTCPS1 屬性

VAL_IN1_MODBUSGENTCPS1 /VAL_IN2_MODBUSGENTCPS1的屬性

要反復檢查,不要遺留,要不然也搞不定,
設定完成后,點擊HW Configuration 邊上的Mapping ,這時切換到RES 視窗,發現在里面添加了兩個功能塊MODBUSGENTCPS MBRead 和 MODBUSGENTCPS MBWrite.你可以添加連線如下圖,

GO 語言撰寫了一個簡單的modbus server
package main
import (
"log"
"time"
"github.com/tbrandon/mbserver"
)
func main() {
serv := mbserver.NewServer()
err := serv.ListenTCP("0.0.0.0:502")
if err != nil {
log.Printf("%v\n", err)
}
defer serv.Close()
// Wait forever
for {
time.Sleep(1 * time.Second)
}
}
TCP/UDP 通信
modbusTCP 協議比較適合soft dPAC 連接遠程IO模塊,而TCP/UDP 更適合于軟體交換資料,EAE 有一個NETIO 功能塊 提供給用戶建立特定的TCP,UDP 通信,這個功能塊意義非凡,使用戶可以實作與非EAE 程式的通信,
下面是一個簡單的例子:

ENDPOINT 設定外部應用的協議型別和IP 地址,埠, 在EAE 的檔案中解釋有點凌亂,我設定為 TCP Client 模式,在9200 埠接收資料,在與Soft dPAC 同一臺主機上向9201 發送資料,
'TCP:9200;127.0.0.1:9201'
外部的測驗程式采用GO 語言撰寫,代碼如下:
package main
import (
"fmt"
"net"
"os"
"strings"
// "strconv"
)
const (
CONN_HOST = "localhost"
CONN_PORT = "9201"
CONN_TYPE = "tcp"
)
func main() {
// Listen for incoming connections.
l, err := net.Listen(CONN_TYPE, CONN_HOST+":"+CONN_PORT)
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
// Close the listener when the application closes.
defer l.Close()
fmt.Println("Listening on " + CONN_HOST + ":" + CONN_PORT)
for {
// Listen for an incoming connection.
conn, err := l.Accept()
if err != nil {
fmt.Println("Error accepting: ", err.Error())
os.Exit(1)
}
// Handle connections in a new goroutine.
go handleRequest(conn)
}
}
// Handles incoming requests.
func handleRequest(conn net.Conn) {
// Make a buffer to hold incoming data.
buf := make([]byte, 1024)
index:=0
for {
// Read the incoming connection into the buffer.
cnt, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
}
line := strings.TrimSpace(string(buf[0:cnt]))
fmt.Println(line)
// Send a response back to person contacting us.
index=index+1
if index>128 {
index=0
}
fmt.Printf("message recieved :%d\n",index)
conn.Write([]byte(fmt.Sprintf("message recieved :%d",index)))
// Close the connection when you're done with it.
}
conn.Close()
}
運行的結果如下:

一個簡單的軟體網關(Soft Gateway)
Soft dPAC 只是提供了一個簡單的TCP,UDP和modbusTCP通信機制,為了實作Soft dPAC與容器中的其它微服務通信,需要設計一個軟體網關,將TCP 資料轉化成為微服務的訊息總線協議,為了簡單演示,我們實作了一個 TCP/MQTT 的軟體網關(Soft Gateway),它采用Go 語言撰寫,
MQTT 代理使用開源Eclipse Mosquitto ,
Soft Gateway 代碼
(未完成,敬請期待吧!)
結束語
經過這些實驗后,你大概能夠體會到為什么說施耐德的EAE 是一個開放自動化系統了,如果你對容器,云平臺等相關技術了解的IT 工程師,你會想象出各種應用場景,產生無限的遐想,EAE 的確是你想要的樣子,
建議你再次閱讀我的博文理想的開放自動化
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/239578.html
標籤:其他
下一篇:AD19制作stm32最小系統板
