序文
IEC61499は、分散制御システムの機能ブロック標準です。複数のデバイスと他の外部デバイスの間で情報が交換されます。この情報交換は、通信機能ブロックを介して実現されます。通信機能ブロックには次のものが含まれます。
一方向通信機能ブロック:公開/購読
双方向通信機能ブロック:クライアント/サーバー
デバイス間のメッセージは、タイプと値で構成される機能ブロック(IEC61499-FBDATA)のデータです。通信機能ブロックには、複数のデータの入力と出力が含まれる場合があります。各入力および出力データは、単純な単一値データタイプまたは配列タイプ(構築済み)にすることができます。したがって、複数のデータを交換する必要があります。複数のデータの情報抽象識別は、ASN.1コーディングおよびデコード方法を採用しています。
ASN.1
抽象構文表記ASN.1(抽象構文表記1)は、I SO8825-1の国際標準です。コンパクトな方法を使用して、整数、ブール値、浮動小数点数など、コンピューター内のデータを抽象的に識別します。記述構文が採用されているのは、ASN.1がユニバーサル言語であるからです。最初はとても複雑に感じます。IEC61499規格では、ISO8825-1の基本的なコーディング規則のみが採用されています。また、詳細な仕様と説明は、IEC61499-1の付録E情報交換に記載されています。学習を組み合わせる方が明確です。
ASN.1の基本的なエンコーディングルール
データ値のエンコードは4つの部分で構成されます
オクテットの識別(オクテットの識別)
長さオクテット
コンテンツオクテット
コンテンツオクテットの終わり
コンテンツの終わりのオクテットはデフォルトで設定できます。したがって、ほとんどの場合、それは3段階のロゴです
| 識別子オクテット| 長さオクテット| 内容オクテット|
TLVトリプルと呼ばれることもあります<タイプ、長さ、値>
識別子の定義
8位と7位はタグのクラスを表します
IEC61499-1の付録Eでは、FBDATAのASN.1エンコーディングルールがさらに標準化されています
-tagのクラスはApplicationです。8、7はすべて0、1です
-基本データタイプのタグ番号
BOOL0 0
BOOL1 1
聖2
INT 3
DINT 4
LINT 5
UINT 6
USINT 7
UDINT 8
ULINT 9
REAL 10
LREAL 11
時間12
日付13
TIME_OF_DAY 14
DATE_AND_TIME 15
ストリング16
BYTE 17
ワード18
DWORD 19
LWORD 20
WSTRING 21
アレイ
ArrayVariable 22
IEC61499FBDATAのASN.1エンコーディング
(IEC61499-1付録E)には、次の2つのタイプがあります。
-基本(BASIC)コーディング
ISO / IEC8825-1の基本的なコーディング規則に準拠する
-コンパクト(COMPACT)コーディング
ComPACTエンコーディングは4DIACで使用されます。
上記のデータタイプでは、長さ(長さオクテット)が省略され、さまざまなデータタイプの長さがデフォルトになります。
シンプルタイプのデータエンコーディング
コンパクトなコーディングにより、複数のデータが連続して配置されます。
例:4 INT
tag = 01000011 = 0x43ここで、class = 01、P / Construct = 0、タグ番号= 3 = 00011
最終コード
0x43この0x00,0x00、0x43この0x00,0x00、0x43この0x00,0x00、0x43この0x00,0x00
アレイタイプのエンコーディング
-タグNo.6は1構築されています
-長さは、16ビットの符号なし番号であるUINTとしてエンコードされます
-配列の最初の要素にはタグ(COMPACT Encoding)があり、次の要素はデフォルトでタグになります
たとえば、LREAL [2]のエンコーディングは次のとおりです。
タグ= 0x76 = 01110110ここで
class = 01、P / Constructed = 1、タグ番号= 22 = 10110
長さ= x0002
内容= 8 octetX2
最初の要素(LREAL)のタグは
tag = 01001011 = 0x4bここで、class = 01 / Construct = 0、tag number = 11 = 0x0b = 01011
0x4bはLREALタイプです。2つのLREALが続き、それぞれ64ビットと8バイトです。
最終的なコードは
0x76、 0x00,0x02、0x4b、0x00,0x00,0x00,0x00、0x00,0x00,0x00,0x00、0x00,0x00,0x00,0x00、0x00,0x00,0x00,0x00
プログラム例
このシンプルなソフトウェアを使用して、クライアント機能ブロックによって送信されたASN.1コード化FBDATAを表示できます。
package main
import (
"fmt"
"net"
"os"
)
func main() {
arguments := os.Args
if len(arguments) == 1 {
fmt.Println("Please provide a port number!")
return
}
PORT := ":" + arguments[1]
s, err := net.ResolveUDPAddr("udp4", PORT)
if err != nil {
fmt.Println(err)
return
}
connection, err := net.ListenUDP("udp4", s)
if err != nil {
fmt.Println(err)
return
}
defer connection.Close()
buffer := make([]byte, 1024)
serveraddr, _ := net.ResolveUDPAddr("udp", "192.168.31.108:8881")
client, _ := net.DialUDP("udp4", nil, serveraddr)
for {
// n, addr, err := connection.ReadFromUDP(buffer)
n, _, _ := connection.ReadFromUDP(buffer)
txbuf := make([]byte, n)
for i:=0;i<n;i++ {
fmt.Printf("0x%02x ",buffer[i])
txbuf[i]=buffer[i]
}
fmt.Printf("length=%d\n",n)
_, err := client.Write(txbuf)
if err != nil {
fmt.Println(err)
return
}
}
}
IEC61499規格のFBDATAASN.1コーデックを明確に説明したと信じてください。ASN.1の抽象的な概念を大々的に紹介しませんでした。もちろん、これらを明確に書くために、私も少しお金を稼ぎ、ISO8825-12008バージョンの規格をダウンロードしました。
ブログを深く書くことは非常に重要です。