IEC61499についてデータ交換情報抽象構文ASN.1

序文

 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バージョンの規格をダウンロードしました。

          ブログを深く書くことは非常に重要です。

おすすめ

転載: blog.csdn.net/yaojiawan/article/details/107382193