施耐德開放自動化平臺初體驗(3)

施耐德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 爲基礎的控制運行時,它包括:

  1. 基於事件,網絡透明的自動化能力
  2. 原生過程告警支持
  3. modbus/TCP 客戶端和服務器
  4. OPC UA 服務器
  5. 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 下的運行時有兩個版本:

  1.   X86-64 版本是 Intel X86 下的版本
  2.   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種方式與外部程序交互

  1. 動態庫 DLL 直接調用
  2. modbus TCP
  3. 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),它們包括:

  1. MODBUS,
  2. MODBUSGENTCPS1,
  3. VAL_OUT1_MODBUSGENTCPS1 
  4. VAL_OUT2_MODBUSGENTCPS1 
  5. VAL_IN1_MODBUSGENTCPS1 
  6. 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 的確是你想要的樣子。

建議你再次閱讀我的博文理想的開放自動化

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