天天看點

如何實作 S7-1200/1500 字元串轉換功能

作者:巨控小周

概 述

在我這麼多年的PLC技術支援生涯中,在程式設計相關的問題裡面,字元串程式設計保守估計得占四分之一,而這其中字元串轉換占了絕大多數,今天我們就盤點一下常見的字元串轉換問題。

字元串轉換

2.1 字元串

西門子的 SIMATIC 字元串和第三方常見的字元串有所不同,SIMATIC 字元串的結構與占用空間,如圖 1 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖 1. SIMATIC 字元串的結構

SIMATIC 字元串資料類型最大字元長度與占用空間的關系,如圖 2 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖 2. 最大字元長度與占用空間

SIMATIC 字元串還可以自定義最大字元長度資料類型,如圖 3 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖 3. 自定義最大字元長度的資料類型

String 的每個字元的類型是 Char,遵循 ASCII 碼,當然如果作業系統的區域語言設定為中文(簡體,中國),可以使用 GB2312 編碼用連續兩個字元表示漢字。WString 的每個字元的類型是 WChar,遵循 Unicode 編碼。每個漢字都有獨立的字元表示,但是與 GB2312 不同。

圖 4 展示了不同編碼下的漢字。一個 String[10] 類型變量,一個 WString[20] 類型變量,值都是“西門子”,以“西”字為例,String 類型變量值為 16#CEF7,WString 類型變量值為 16#897F。此外可以觀察一下最大長度和實際長度在字元串中的位置和值。

如何實作 S7-1200/1500 字元串轉換功能

圖 4. 不同的編碼

上面所說的是西門子的 SIMATIC 字元串,而一般市面常見上位機或者儀表等所指的字元串其實對應的是圖 1 所示的 SIMATIC 字元串後半截的字元部分,對于西門子來說,這叫做字元數組,Array Of Char,或者 Array Of WChar。對于上位機來說還好,隻是格式不相同,編碼通常是一樣的。困難的是儀表,除了格式不同,儀表的字元編碼通常也是各式各樣的,為程式的讀取轉換造成了很多麻煩,字元串轉換問題也主要是因為這個而産生。

2.2 字元串轉換指令

前面聊了字元串的基本知識,下面簡單介紹一下字元串轉換的相關指令,更多指令說明需要查閱 TIA Portal 幫助。如圖 5 紅框所示為 TIA Portal 自帶的字元串轉換指令。

如何實作 S7-1200/1500 字元串轉換功能

圖 5. 字元串轉換相關指令

這部分指令又細分成三類。

  • 第一類是數值和字元串之間的轉換

這裡注意,數值都是十進制數,不論是浮點數還是整數,如圖 6 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖6.數值轉換相關指令

  • 第二類是字元數組與字元串之間的轉換

主要用在通信前的最後一次、通信後的第一次轉換。如前所述通信對象通常都是字元數組,需要将字元串轉為字元數組(通信前)、将字元數組轉換為字元串(通信後),詳細介紹如圖 7 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖7.字元數組和字元串的轉換

  • 第三類是字元和十六進制之間的轉換

從名字就能看出來,ATH和HTA,A就是ASCII,H就是Hex(十六進制Hexadecimal),記住這兩個縮寫就能知道轉換方向,在與第三方通信時經常需要用到,詳細介紹如圖 8 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖8.字元和十六進制之間的轉換

2.3 字元串轉換案例

下面就用幾個常見的例子為大家示範字元串的轉換。

案例1

某掃碼槍将掃描到的二維碼,通過 Profinet IO 将這一串字元送入 PLC 的 String字元串變量,如圖 9 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖9. 轉換案例

程式設計思路:

通常我們的做法是建立一個非優化 DB 塊,然後建立 String 類型變量(這裡是String[15]),然後通過 SCL 的 PEEK 指令将每個 IB 的字元送入 String 的每個字元,最後為 String 變量的實際字元長度指派(這裡是15),然後結束。

這麼做肯定是沒有問題的,不過推薦使用 Chars_TO_Strg 指令,這個指令需要字元數組作為輸入,我們可以通過将 PLC 變量(案例中的 IB100-IB114)設定為字元數組類型,然後進行轉換。這裡的 String 是優化變量,也不專門為實際字元長度指派。

雖然 PLC 變量不能直接設定為數組類型,但是可以設定為 PLC 資料類型,是以我們可以考慮建立 PLC 資料類型,裡面添加數組類型變量,然後就可以間接地将PLC 變量設定為數組,如圖 10 所示。(注:如果 PLC 資料類型中包含字元串類型,那麼 PLC 變量無法定義為該 PLC 資料類型,否則無需程式設計即可實作)

如何實作 S7-1200/1500 字元串轉換功能

圖10. 定義變量

之後就可以編寫相關轉換程式,檢視轉換結果。如圖 11 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖11. 轉換及結果

案例2

某儀表需要進行給定,PLC 設定的浮點數值傳送到字元數組後通過 TCP 傳送給儀表,如圖 12 所 示。

如何實作 S7-1200/1500 字元串轉換功能

圖12. 轉換案例

程式設計思路:

因為 S_CONV 進行浮點數轉換時,隻會将浮點數轉換的字元串顯示為科學計數法形式,是以在沒有 VAL_STRG 指令的 S7-300/400 上,這個問題程式設計會很麻煩,比如通過放大/縮小倍數取整得到每一位,然後把每一位連同小數點轉換成對應字元。

現在有了 VAL_STRG 指令,就可以直接指定轉換為正常小數顯示的字元串。SCL程式設計如圖 13 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖13. 轉換程式設計

這裡需要注意的是 VAL_STRG 轉換後是右對齊,是以前面會産生很多空格,如圖 14 所示。是以需要使用 DELETE 指令删除空格得到最終的字元串。

如何實作 S7-1200/1500 字元串轉換功能

圖14. 轉換删除

最後得到的字元數組 “strData”.setChars 變量通過 TCP 發送程式傳送到儀表,如圖 15 所示為輸出結果。

如何實作 S7-1200/1500 字元串轉換功能

圖15.輸出結果

案例3

某儀表将浮點數的十六進制表示方式以字元的形式,通過序列槽通信的方式傳遞給PLC,如圖 16 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖16.儀表發送原理

程式設計思路:

通過序列槽接收指令(Receive_P2P)可以直接将對方發送的字元數組接收為字元串,通過序列槽發送指令(Send_P2P)可以直接發送字元串,對方将會收到字元數組,這樣就無需使用 Strg_TO_Chars 與 Chars_TO_Strg 指令進行轉換了。

注意:通過 TCP、UDP 等開放式使用者通信的方式與序列槽是不一樣的,需要使用上面的轉換指令。

因為 PLC 接收到的是十六進制對應的 ASCII 組成的字元串,是以需要先轉換成十六進制數,這時需要使用 ATH 進行轉換,轉換成 DWord 類型後,再轉換成Real 即可,程式如圖 17 所示,結果如圖 18 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖17.程式

如何實作 S7-1200/1500 字元串轉換功能

圖.18 結果

對案例 3 再進行修改,如果儀表傳遞的是十六進制每個字元的 ASCII 數值的 ASCII 碼呢,如圖 19 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖19.修改後的儀表發送原理

此時 PLC 需要使用兩次 ATH 指令,第一次把每兩個連續 ASCII 碼轉換成一個十六進制對應的 ASCII 碼,第二次再把 ASCII 轉換成十六進制,如圖 20 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖20.轉換過程

圖 17 中第二行程式替換程式,如圖 21 所示,注意第一次 ATH 轉換16個字元,第二次轉換8個字元,結果如圖 22 所示。

如何實作 S7-1200/1500 字元串轉換功能

圖21.替代程式

如何實作 S7-1200/1500 字元串轉換功能

圖22.結果

繼續閱讀