施耐德开放自动化平台初体验(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 的确是你想要的样子。

建议你再次阅读我的博文理想的开放自动化

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