
1. PLC 數據類型是什么為什么第二十三講必須搞明白這一講我們要解決一個工程里非常基礎、但天天踩坑的問題PLC 數據類型定義與進制轉換。先直接給結論PLC 程序跑得穩不穩很多時候不是邏輯寫錯而是數據類型選錯、進制換算錯。比如用 INT 存了一個實際超過 32767 的數值數據直接溢出用浮點數做精確計數累加多了出現誤差和別人設備通信時Modbus 寄存器讀到的是十六進制要拼成十進制才知道實際溫度觸摸屏上顯示的是 100PLC 里卻是 0x64不懂進制轉換排查一下午都找不到原因。這一講的內容適合這幾類讀者剛入門 PLC 編程還在搞不懂位、字節、字、雙字的區別做設備維護經常遇到觸摸屏數值顯示不對、通信數據對不上需要和第三方設備走 Modbus、TCP/IP 通信要手動解析寄存器數據自學西門子、三菱、匯川等品牌 PLC想一次性把數據類型和進制轉換的關系理清楚。本文會圍繞五個部分展開PLC 數據類型的底層存儲邏輯、位/字節/字/雙字/浮點數的區別、進制轉換的工程實操方法、觸摸屏與通信場景中的數據換算以及常見錯誤排查清單。無論你用的是西門子博途、三菱 GX Works還是匯川 InoProShop底層的存儲原理是一致的。把這講內容吃透后面學運動控制、伺服通信、PID 運算都會輕松很多。2. PLC 核心能力速覽能力項說明適用范圍西門子、三菱、匯川、歐姆龍、臺達等主流 PLC 編程數據類型位 BOOL、字節 BYTE、整數 INT/DINT、浮點數 REAL/LREAL、字符串 STRING核心痛點數據類型溢出、數據長度不匹配、通信寄存器解析錯誤進制使用場景Modbus 通信、觸摸屏地址映射、PID 參數計算、變頻器控制字操作工具計算器程序員模式、博途監控表、GX Works 軟元件批量監控常見錯誤INT 溢出、REAL 精度丟失、十六進制與十進制混淆、字節順序錯誤這里要強調一點不同品牌 PLC 對數據類型的關鍵字命名有差異比如西門子用 DINT 表示雙整數三菱用 D 寄存器配合 BIN/BCD 指令匯川與西門子風格接近。但數據在內存里的長度和取值范圍是統一的。搞清楚底層位數換品牌只是換指令名字的問題。3. PLC 數據類型的底層存儲邏輯PLC 本質上是一臺工業專用計算機所有數據在 CPU 內部都以二進制存儲。一個二進制的位只有 0 和 1 兩個狀態多個位組合起來就能表示更大的數。以最常用的 16 位整數為例它的存儲范圍是 -32768 到 32767。PLC 用最高位第 15 位表示符號0 為正、1 為負剩下 15 位表示數值。這里有一個容易踩坑的點很多人以為 INT 可以存到 65535實際這是無符號 WORD 的范圍不是 INT。再往上就是 32 位數據。DINT雙整數用 32 位存儲范圍約 -21 億到 21 億REAL浮點數也用 32 位存儲但內部把 32 位拆成了符號位、指數位和尾數位所以它能表示很大或很小的數但精度有限。這也是為什么累計計數、錢款計算這類需求不建議用 REAL而要用 LREAL 或 DINT。下面用一個表格總結最常見的 PLC 數據類型數據類型位寬取值范圍典型用途BOOL1 位TRUE / FALSE啟停信號、報警狀態、按鈕輸入BYTE8 位0 到 255ASCII 碼、小范圍狀態值、通信字節WORD16 位0 到 65535Modbus 寄存器原始值、狀態字INT16 位-32768 到 32767普通整數運算、模擬量標定DINT32 位-2147483648 到 2147483647大數計數、累計量、位置值REAL32 位約 ±3.4e38溫度、壓力、流量等模擬量運算LREAL64 位約 ±1.7e308高精度浮點運算STRING8 位/字符與長度有關設備名稱、故障信息、配方名這張表是所有 PLC 程序設計的基石。任何一個變量都要先想清楚它最大可能到多少再決定用哪種類型。比如一個設備運行次數計數器用 INT 可能在半年后溢出但用 DINT 能跑幾十年。4. PLC 進制轉換基礎二進制、十進制、十六進制PLC 編程里最常用的進制是二進制、十進制、十六進制偶爾會用到 BCD 碼。二進制是 CPU 的唯一語言每一位只能是 0 或 1。十進制是人類習慣的表示方式。十六進制是二進制的縮寫形式每 4 位二進制對應 1 位十六進制方便閱讀和書寫。對應關系如下二進制 0000 0001 0010 0011 0100 0101 0110 0111 十六 0 1 2 3 4 5 6 7 十進制 0 1 2 3 4 5 6 7 二進制 1000 1001 1010 1011 1100 1101 1110 1111 十六 8 9 A B C D E F 十進制 8 9 10 11 12 13 14 15在 PLC 程序里一個 16 位數據用十六進制表示就是 4 位比如 16#1F4用二進制表示就是 16 位比如 2#0000000111110100可讀性差很多。因此編程軟件默認會用十六進制顯示通信數據和原始寄存器值。這里必須區分 BCD 碼和十六進制。BCD 碼是用 4 位二進制表示一位十進制數比如十進制 25 的 BCD 編碼是 0010 0101而十六進制 0x25 的十進制值是 37。很多老設備、溫控器、電子秤的輸出就是 BCD 碼如果程序里當成普通十六進制處理數值會直接偏掉。工程中進制轉換最直接的方法是使用電腦計算器的程序員模式。Windows 自帶的計算器切到程序員模式后可以在 HEX、DEC、OCT、BIN 之間切換輸入一個值會自動顯示其他進制結果。比如在 HEX 里輸入 1F4切換到 DEC 就得到 500再切到 BIN 就是 0000000111110100。但不要過度依賴計算器PLC 程序里也會用到進制轉換指令。比如西門子的 BCD_I 可以把 BCD 碼轉成整數I_BCD 可以把整數轉成 BCD 碼三菱的 BIN 和 BCD 指令功能類似匯川的博途風格指令也支持類似操作。5. PLC 數據類型詳解與常見應用場景5.1 BOOL 位數據BOOL 是最基礎的數據類型只占 1 位值只能是 TRUE 或 FALSE。在梯形圖里常開觸點、常閉觸點、線圈都基于 BOOL 邏輯。輸入端子映射到 I 區輸出端子映射到 Q 區中間繼電器映射到 M 區都是 BOOL 類型。使用 BOOL 時要注意物理輸入和程序邏輯的常開常閉關系。比如急停按鈕硬件上通常接常閉觸點程序里再用常開指令讀取這樣斷線時設備也能停下來這是安全回路設計的基本原則。5.2 BYTE、WORD、DWORD 無符號數據BYTE 是 8 位WORD 是 16 位DWORD 是 32 位它們都只能表示非負整數。為什么需要無符號類型因為有些數據天然沒有負數比如設備狀態字、報警位映射、通信協議里的寄存器原始值。用無符號類型可以避免符號擴展帶來的麻煩。舉個例子Modbus 讀取回來的保持寄存器原始值就是一個 16 位 WORD。如果兩個寄存器拼成一個 32 位浮點或 DWORD就要注意高低字節順序。不同設備有 Big-Endian 和 Little-Endian 之分解析錯了數值會變得非常離譜。5.3 INT、DINT 有符號整數INT 是 16 位有符號整數DINT 是 32 位有符號整數。這是程序里最常用的計算類型。一個典型問題是模擬量處理。當 4-20mA 或 0-10V 信號進入 PLC模擬量模塊會把電流或電壓轉換成數字量。西門子 S7-1200 的默認范圍是 0 到 27648三菱 FX 系列常見范圍是 0 到 4000。如果直接把原始值當成工程量去顯示肯定不對必須先做標定換算。比如 4-20mA 對應溫度 0-100 度采集到的原始值是 13824按公式工程值 原始值 / 滿量程 * (上限 - 下限) 下限先判斷量程范圍是 0 到 27648還是 0 到 4000再計算結果。這個換算過程里數據類型選錯會直接導致負數或溢出。5.4 REAL、LREAL 浮點數REAL 是 32 位單精度浮點數LREAL 是 64 位雙精度浮點數。溫度、壓力、流量、速度這些模擬量通常都用浮點數參與運算。REAL 的精度大約 7 位有效數字。看起來精度夠用但做累積計算時誤差會逐漸放大。比如把一個很小的值反復累加 100 萬次REAL 可能出現明顯偏差LREAL 會好很多。另一個坑是 EQUAL 比較。兩個浮點數不要直接比較是否相等而是比較差值是否小于某個閾值ABS(value1 - value2) 0.001在博途里可以用 EQ 指令配合 ABS 函數在三菱里可以用 ZCP 區間比較或者子程序里做減法判斷。5.5 STRING 字符串STRING 用于存放設備名稱、報警信息、配方名、JSON 字符串。西門子 STRING 的默認長度是 254 個字符占用空間是長度加 2 個字節管理位。三菱和匯川的字符串處理風格不同有的用了指針結構通信解析時要特別注意長度前綴。通信場景里字符串經常要和 BYTE 數組互相轉換。比如用 C# 和西門子 PLC 通過 S7 協議通信讀取到的字符串需要按字節解析寫入時也要把 C# 字符串轉成 PLC 要求的格式否則會出現亂碼。6. PLC 進制轉換實操模擬量標定與通信數據解析6.1 實操場景一4-20mA 溫度信號換算設備上有一個 4-20mA 輸出的溫度變送器量程 0-150 度PLC 模擬量模塊采集到的原始值是 12000。這里要先用計算器把十進制 12000 轉成十六進制確認數據沒有符號溢出。直接算工程值工程值 12000 / 27648 * 150 - 0 工程值 ≈ 65.1 度如果把原始值當成 INT 讀取且模塊是 12 位分辨率原始值可能是 3000 而不是 12000因為不同分辨率下每毫安對應的數字量不同。使用前必須先查模塊手冊。建議在程序里寫一個模擬量標定功能塊輸入原始值和量程上下限輸出工程值后面所有通道都復用這個功能塊。6.2 實操場景二Modbus 寄存器讀取變頻器頻率通過 Modbus RTU 讀取變頻器運行頻率寄存器地址 0x2100返回 16 位數據。變頻器手冊規定實際頻率 寄存器值 / 100單位 Hz。假設讀取到寄存器值十六進制 0x0BB8用計算器切換到 DEX 得到 3000再除以 100 得到 30.00 Hz。在博途里可以用 MOVE 指令把讀取的 WORD 移到 INT 變量再除以 100 轉成 REAL 顯示。在三菱里使用 FROM 指令讀取后進行同樣的換算。這里最容易錯的是溢出。如果寄存器值是 0xFFFF在無符號 WORD 里代表 65535但轉成 INT 會變成 -1。因此通信解析時要嚴格區分有符號和 無符號。Modbus 的保持寄存器本質是無符號 16 位但很多設備會把負數編碼成有符號整數解析方式取決于設備手冊。6.3 實操場景三BCD 碼解析電子秤數據很多電子秤、溫控器、老式儀表輸出的是 BCD 碼。比如 BCD 碼數據 0x1234表示十進制 1234不是十六進制的 4660。在西門子里用 BCD_I 指令把 BCD 碼轉成 INT得到 1234。在三菱里用 BCD 和 BIN 指令進行互轉。匯川的指令集與西門子類似可以在指令幫助里搜索 BCD。如果通信讀取的數據不符合 BCD 編碼規則比如出現 A-F 的位轉換結果可能直接報錯或得到錯誤值。這時先檢查設備手冊確認數據格式是 BCD 還是普通十六進制。6.4 實操場景四DWORD 拆分與組合有些通信協議會把 32 位數據拆成兩個 16 位寄存器發送。比如流量計輸出累計流量高 16 位存一個寄存器低 16 位存另一個寄存器。讀取后要把兩個 WORD 組合成 DWORDDWORD_value HIGH_word * 65536 LOW_word如果 PLC 的字符串指令支持也可以使用移位和或運算DWORD_value (HIGH_word 16) | LOW_word注意不同設備可能先發高字節再發低字節也可能相反。正確解析前先用固定測試值驗證字節序。比如設備手冊說發送 0x12345678看先到的是 0x1234 還是 0x5678。7. 觸摸屏與 PLC 數據類型映射觸摸屏組態時地址類型和 PLC 數據類型必須一致。常見錯誤包括觸摸屏上建了一個 INTPLC 里卻是 REALPLC 里是 DINT觸摸屏卻按 DWORD 讀取導致負數和正數顯示錯亂。以西門子 Smart Line 觸摸屏和 S7-200 SMART PLC 為例地址映射規則如下觸摸屏地址PLC 數據區數據類型說明I0.0輸入位BOOL按鈕/開關狀態Q0.0輸出位BOOL電機/閥門輸出VW100V 區字INT/WORD16 位數據VD200V 區雙字DINT/REAL32 位數據在博途的 WinCC 組態里連接 S7-1200 時直接選擇 PLC 變量類型會自動帶入。但如果是和第三方設備通信或者用觸摸屏直接讀 Modbus 從站就要手動指定字節順序、數據類型和數據長度。很多觸摸屏有數據格式設置可以選擇 BCD、HEX、DEC 等顯示方式選錯會出現一個值對不上的問題。如果出現觸摸屏顯示值和 PLC 監控值不一致先做三件事確認觸摸屏和 PLC 連接是否建立通信狀態是否正常確認地址是否偏移西門子 V 區地址和 Modbus 地址存在差一或差二的情況確認數據類型和數據格式REAL 按 DINT 讀取浮點數會變成奇怪的數字。8. PLC 數據類型與進制轉換常見問題排查問題現象可能原因排查方式解決方案數值超過 32767 變成負數INT 溢出打開監控表查看變量類型改為 DINT 或使用無符號 WORD觸摸屏顯示值和 PLC 不一致地址偏移或數據類型不一致對比觸摸屏地址和 PLC 變量地址核對地址映射表統一數據類型Modbus 讀取結果異常大有符號/無符號解析錯誤用計算器查看十六進制確認設備手冊按手冊規定用 WORD 或 INT 解析浮點數累計誤差越來越大REAL 精度不足查看累計次數和數值范圍改用 LREAL 或 DINT 計數BCD 碼解析結果偏了把 BCD 當十六進制處理確認設備輸出格式為 BCD使用 BCD_I 或 BIN 指令轉換通信數據高低字節反了字節序錯誤用固定值 0x1234 測試交換高字節低字節或修改組態模擬量原始值跳變數據類型長度不匹配檢查模擬量模塊分辨率確認范圍 0-27648 / 0-4000 / 0-4095字符串顯示亂碼字符串格式不一致查看 PLC 字符串管理字節按 PLC 品牌格式轉換字符串前面講到的這些排查方法核心思路只有一個先回到二進制層面看數據再回到 PLC 變量類型看解釋方式。數據是一樣的解釋方式不同結果就完全不同。9. PLC 數據類型與進制轉換最佳實踐這一節直接給出工程建議照著做能避開大多數數據類型相關的坑。第一建立統一的變量命名規范。命名里帶類型前綴例如bStart // BOOL 啟動信號 wStatusWord // WORD 狀態字 iTemperature // INT 溫度原始值 diCounter // DINT 累計次數 rPressure // REAL 壓力工程值這樣寫梯形圖時看到變量名就能判斷它是什么類型不易搞混。第二模擬量通道統一使用功能塊。把原始值到工程值的換算封裝成一個功能塊輸入量程上下限和原始值輸出工程值。比如西門子 FC / FB 里做一個 Analog_Scale 塊三菱和匯川也可以做類似子程序。這樣更換量程時不需要改主程序只改參數。第三通信地址和類型做成配置文件。如果項目里要對接多個從站設備建議把設備地址、寄存器起始地址、數據類型、字節序、縮放系數都放在一個數據結構里統一解析。排查問題時只需要比對配置表和設備手冊不需要一行行看梯形圖。第四批量任務和批量監控要有分層。比如一套設備有 8 個溫度通道建議用數組或結構體數組管理數據。西門子里可以用 UDT 定義結構體三菱里可以用文件寄存器加變址尋址。這樣批量下裝、批量監控、批量修改參數都會方便很多。第五進制轉換要保留計算過程和注釋。比如寫模擬量標定時注釋里寫清量程、原始范圍、換算公式寫 Modbus 解析時注釋里寫清映射地址和數據類型。半年后維護程序這些注釋能救命。第六在線下載前先備份原程序下載時選擇只下載修改內容避免因為強制賦值導致設備狀態變化。涉及實際設備的修改一定要先切到手動模式或安全狀態。10. 總結與下一步這一講把 PLC 數據類型和進制轉換放在一起講是因為它們在工程中根本分不開。類型決定了數據在內存中的解釋方式進制決定了外部通信和顯示時的數值呈現形式。任何一方搞錯程序邏輯再正確最終出來的數據也是錯的。最值得先動手驗證的事情是打開你正在用的 PLC 編程軟件新建一個監控表用不同類型的變量存儲同一個十六進制值觀察顯示結果。比如把 0xFFFF 分別放到 WORD 和 INT 里你會看到一個是 65535一個是 -1。這個實驗做完了你對數據類型和進制轉換的理解會上一個臺階。最容易踩的坑就是模擬量處理和通信協議解析時不查手冊憑經驗猜測數據范圍和字節序。不同廠家分辨率不同、地址偏移不同、字節序不同動手前先花五分鐘確認手冊能省掉幾個小時排查時間。后續可以繼續擴展的方向PLC 數組與結構體、Modbus RTU/TCP 通信實戰、模擬量 PID 控制、PLC 與上位機 C# 通信、觸摸屏報警系統和配方管理。把這些串起來你就能獨立完成一個完整設備的程序設計和調試。建議收藏備用。下一講如果有機會可以繼續剖析 PLC 工程師查故障的通用思路用案例串講數據類型、通信報文和設備動作的聯動關系。