Java實(shí)現(xiàn)從PLC讀取數(shù)據(jù)的常見主流且可行方案
這是一個非常經(jīng)典且常見的工業(yè)物聯(lián)網(wǎng)(IIoT)或自動化集成需求。
要從PLC讀取數(shù)據(jù),Java本身并不直接支持PLC的通信協(xié)議,所以你需要借助一些中間件或庫來實(shí)現(xiàn)。
核心思路:PLC通常使用工業(yè)以太網(wǎng)協(xié)議(如Modbus TCP、S7協(xié)議、OPC UA等)進(jìn)行通信。Java需要通過特定的庫來“說”這些協(xié)議。
以下是幾種主流且可行的方案,按推薦程度和應(yīng)用場景排序
方案一:使用 Modbus TCP 協(xié)議(最常見、跨平臺性好)
如果PLC支持Modbus TCP協(xié)議(西門子、三菱、施耐德等很多品牌都支持,或者通過擴(kuò)展模塊支持),這是Java接入最簡單的方式。
推薦庫: Jamod 或 EasyModbus
步驟示例:
1.引入依賴(以 EasyModbus 為例,Maven):
<dependency>
<groupId>de.re.easymodbus</groupId>
<artifactId>easymodbus4j</artifactId>
<version>1.2.1</version>
</dependency>2.Java 代碼示例(讀取保持寄存器):
import de.re.easymodbus.modbus.ModbusClient;
public class ReadPLC {
public static void main(String[] args) {
ModbusClient modbusClient = null;
try {
// 1. 創(chuàng)建Modbus客戶端,指定PLC的IP和端口(Modbus TCP默認(rèn)端口為502)
modbusClient = new ModbusClient("192.168.1.100", 502);
// 2. 建立連接
modbusClient.Connect();
// 3. 讀取數(shù)據(jù)(示例:從地址0開始讀取3個保持寄存器)
// 函數(shù)說明:ReadHoldingRegisters(起始地址, 數(shù)量)
int[] registers = modbusClient.ReadHoldingRegisters(0, 3);
// 4. 輸出讀取到的值
System.out.println("寄存器0的值: " + registers[0]);
System.out.println("寄存器1的值: " + registers[1]);
System.out.println("寄存器2的值: " + registers[2]);
// 寫入數(shù)據(jù)示例(可選)
// modbusClient.WriteSingleRegister(0, 100); // 向地址0寫入值100
} catch (Exception e) {
e.printStackTrace();
} finally {
// 5. 關(guān)閉連接
if (modbusClient != null && modbusClient.isConnected()) {
modbusClient.Disconnect();
}
}
}
}適用場景: PLC支持Modbus TCP,且需要快速開發(fā)、無需太復(fù)雜的配置。
方案二:使用西門子 S7 協(xié)議(針對西門子PLC)
如果你面對的是西門子S7系列(如S7-1200, S7-1500, S7-200 Smart),它們通常使用專有的S7協(xié)議。
推薦庫: S7Connector 或 Moka7 (Java移植版)
步驟示例(使用 S7Connector):
1.引入依賴(Github項目,需手動導(dǎo)入Jar或通過Jitpack集成)。
2.代碼示例:
// 以開源庫 S7Connector 為例
import pl.com.s7p.s7connector.*;
public class SiemensS7Reader {
public static void main(String[] args) {
S7Connection connection = new S7Connection();
try {
// 1. 連接到PLC (IP地址, 機(jī)架號0, 插槽號1 通常用于S7-1200/1500)
// 對于S7-200,機(jī)架和插槽通常是0/0或0/1,需查閱PLC配置
connection.ConnectTo("192.168.1.10", 0, 1);
// 2. 讀取DB塊數(shù)據(jù) (DB編號, 起始字節(jié), 讀取字節(jié)長度)
byte[] buffer = connection.ReadArea(S7Area.DB, 1, 0, 10); // 讀取DB1,從第0字節(jié)開始,讀10個字節(jié)
// 3. 解析字節(jié)數(shù)據(jù)為Java類型 (需要根據(jù)PLC數(shù)據(jù)類型手動解析)
// 例如,前4個字節(jié)是一個浮點(diǎn)數(shù)
float value = S7Util.getFloatAt(buffer, 0);
System.out.println("DB1.DBD0 的值為: " + value);
} catch (Exception e) {
e.printStackTrace();
} finally {
connection.Disconnect();
}
}
}適用場景: 項目特定針對西門子PLC,追求更高的執(zhí)行效率和對S7協(xié)議的支持。
方案三:使用 OPC UA(現(xiàn)代工業(yè)標(biāo)準(zhǔn),適合復(fù)雜系統(tǒng))
OPC UA 是工業(yè)4.0的核心通信標(biāo)準(zhǔn),它獨(dú)立于廠商,安全性高,數(shù)據(jù)建模能力強(qiáng)。如果你需要對接多種品牌PLC,或者構(gòu)建一個中大型的MES(制造執(zhí)行系統(tǒng)),這是最佳選擇。
推薦庫: Eclipse Milo(純Java實(shí)現(xiàn),功能強(qiáng)大,官方推薦)
步驟示例(Eclipse Milo 讀取節(jié)點(diǎn)):
1.引入依賴(Maven):
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>sdk-client</artifactId>
<version>0.6.8</version>
</dependency>2.代碼邏輯(簡化版):
- 創(chuàng)建OPC UA客戶端。
- 配置Endpoint(服務(wù)器地址,如
opc.tcp://192.168.1.10:4840)。 - 身份驗證(可能需用戶名密碼或證書)。
- 連接并瀏覽節(jié)點(diǎn)。
- 讀取節(jié)點(diǎn)的值。
適用場景: 系統(tǒng)集成要求高、需對接多種品牌設(shè)備、強(qiáng)調(diào)安全性和標(biāo)準(zhǔn)化的大型項目。
方案四:通過中間件/數(shù)據(jù)庫(間接讀?。?/h2>
如果不想處理復(fù)雜的協(xié)議,或者PLC端已經(jīng)配置好了向上位機(jī)發(fā)送數(shù)據(jù)的功能:
- MQTT(消息隊列):PLC端通過網(wǎng)關(guān)或自身功能將數(shù)據(jù)發(fā)布到MQTT Broker,Java程序通過Eclipse Paho庫訂閱主題接收數(shù)據(jù)。適合物聯(lián)網(wǎng)云平臺場景。
- ODBC/JDBC(數(shù)據(jù)庫):某些工業(yè)PC或高端PLC支持將數(shù)據(jù)實(shí)時寫入SQL Server、MySQL或Oracle。Java直接通過JDBC去查詢這些表即可。注意: 這不適用于大多數(shù)小型PLC,通常配合IPC(工控機(jī))使用。
- REST API:一些現(xiàn)代物聯(lián)網(wǎng)PLC或邊緣網(wǎng)關(guān)提供HTTP接口,Java可以用OkHttp或HttpClient直接GET數(shù)據(jù)。
總結(jié)與建議
| 你的情況 | 推薦方案 |
|---|---|
| PLC型號未知,但大概率支持Modbus | 方案一 (Modbus TCP) —— 最簡單,代碼量最少。 |
| 明確知道是西門子 S7-1200/1500 | 方案二 (S7協(xié)議) —— 直接與西門子對話,性能好。 |
| 對接多個品牌PLC/大型工廠項目 | 方案三 (OPC UA) —— 使用Eclipse Milo,符合未來趨勢。 |
| 不想碰協(xié)議,只想拿數(shù)據(jù) | 方案四 (MQTT) —— 通過消息隊列解耦,更現(xiàn)代化。 |
提示: 開始編碼前,務(wù)必確認(rèn)以下幾點(diǎn),否則代碼寫得再好也連不上:
- PLC的IP地址是否和電腦在同一網(wǎng)段?
- PLC的端口是否開放?(Modbus是502,S7是102,OPC UA通常是4840)
- PLC側(cè)是否開啟了允許遠(yuǎn)程/外部讀寫的權(quán)限?(很多PLC默認(rèn)禁止外部寫入,甚至禁止GET請求)
到此這篇關(guān)于Java實(shí)現(xiàn)從PLC讀取數(shù)據(jù)的常見主流且可行方案的文章就介紹到這了,更多相關(guān)Java PLC讀取數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA JavaWeb項目啟動運(yùn)行后出現(xiàn)404錯誤的解決方法
這篇文章主要介紹了IDEA JavaWeb項目啟動運(yùn)行后出現(xiàn)404錯誤的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
使用Java和Apache POI實(shí)現(xiàn)HTML轉(zhuǎn)Word的完整指南
在數(shù)據(jù)處理和報告生成中,將HTML轉(zhuǎn)換為Word文檔是一個常見需求,本文介紹使用Java和Apache POI庫完成這一轉(zhuǎn)換任務(wù)的步驟,包括依賴引入、HTML內(nèi)容讀取、Word文檔創(chuàng)建、HTML解析并添加到Word,以及最終的文檔保存,需要的朋友可以參考下2025-08-08
在springboot中對kafka進(jìn)行讀寫的示例代碼
本篇文章主要介紹了在springboot中對kafka進(jìn)行讀寫的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
SpringBoot使用@Cacheable出現(xiàn)預(yù)覽工具亂碼的解決方法
直接使用注解進(jìn)行緩存數(shù)據(jù),我們再使用工具去預(yù)覽存儲的數(shù)據(jù)時發(fā)現(xiàn)是亂碼,這是由于默認(rèn)序列化的問題,所以接下來將給大家介紹一下SpringBoot使用@Cacheable出現(xiàn)預(yù)覽工具亂碼的解決方法,需要的朋友可以參考下2023-10-10

