Host Link Communication Function
本文件整理自 KV-XCM02 User's Manual Chapter 5。 Host Link 是 Keyence 自訂的 ASCII-based 通訊協定,簡單易實作、易 debug。
協定特性
| 特性 | 說明 |
|---|---|
| 編碼 | ASCII(每個指令 / 回應均為人類可讀字串) |
| 傳輸 | TCP/IP port 8501(預設,可調 1-65535)/ UDP/IP 8501 |
| Frame 結束符 | CR (0DH) 為主,可選 LF (0AH) 後綴 |
| 連線數 | 16 sockets(TCP,與 Modbus / MC 共享) |
| Server / Client | KV PLC = server,PC = client |
| 並發 | 支援多 client 同時連線 |
為什麼選 Host Link
| 場景 | Host Link 適合度 |
|---|---|
| 現場 debug(telnet 直接打指令) | ⭐⭐⭐⭐⭐ |
| 自寫 .NET / Python 整合 | ⭐⭐⭐⭐ |
| 程式碼 review / 客戶接手 | ⭐⭐⭐⭐⭐ |
| 高速大量 IO(>100 Hz) | ⭐⭐(ASCII overhead 較大) |
| 跨廠商 PLC | ⭐(Keyence-only) |
Frame 格式
Command(PC → PLC)
[Ethernet] [IP] [TCP] [Command ASCII text] [CR] (option 1)
[Ethernet] [IP] [TCP] [Command ASCII text] [CR] [LF] (option 2)
PLC 解析時遇到 CR 即視為命令結束(LF 被忽略)。
Response(PLC → PC)
[Ethernet] [IP] [TCP] [Response ASCII text] [CR] [LF]
PLC 必定附 CR LF。
Communication Principle
TCP/IP Mode
UDP/IP Mode
每個 command / response 都是獨立 datagram,無連線狀態維持。
完整指令清單(22 個指令)
| 功能 | Command | 說明 |
|---|---|---|
| Change mode | Mn | n=0 切 PROGRAM 模式;n=1 切 RUN 模式 |
| Clear error | ER | 清除 CPU 錯誤 |
| Check error No. | ?E | 查當前錯誤碼 |
| Query model | ?K | 查 PLC 機型 |
| Confirm operating mode | ?M | 查 RUN/PROGRAM 狀態 |
| Time setting | WRT | 設 RTC |
| Forced set | ST | 強制設位元 = 1 |
| Forced reset | RS | 強制設位元 = 0 |
| Continuous forced set | STS | 連續多位元強制 = 1 |
| Continuous forced reset | RSS | 連續多位元強制 = 0 |
| Data read | RD | 讀單一 device |
| Consecutive data read | RDS | 讀連續 device |
| Consecutive data read (compat) | RDE | 與 KV-LE20A 相容(同 RDS) |
| Data write | WR | 寫單一 device |
| Write consecutive data | WRS | 寫連續 device |
| Write consecutive data (compat) | WRE | 與 KV-LE20A 相容(同 WRS) |
| Write set value | WS | 寫 timer/counter set value |
| Write consecutive set value | WSS | 寫連續 timer/counter set value |
| Register monitor | MBS / MWS | 註冊 bit / word 監視 |
| Read monitor | MBR / MWR | 讀已註冊監視值 |
| Read comments | RDC | 讀 device comment |
| Bank switching | BE | 切換 file register bank |
| Read expansion buffer memory | URD | 讀擴充模組 buffer |
| Write expansion buffer memory | UWR | 寫擴充模組 buffer |
機型查詢回應(?K 指令)
| KV 機型 | 回應 ASCII | Hex |
|---|---|---|
| KV-X550 | 63 | 36H 33H |
| KV-X530 | 61 | 36H 31H |
| KV-X520 | 60 | 36H 30H |
| KV-X500 | 62 | 36H 32H |
| KV-X310 | 59 | 35H 39H |
| KV-8000 | 57 | 35H 37H |
| KV-8000A | 58 | 35H 38H |
| KV-7300 | 54 | 35H 34H |
| KV-7500 | 55 | 35H 35H |
Device Type 對照(Host Link 用 Keyence 原生命名)
| Device | Symbol | 範圍 | 備註 |
|---|---|---|---|
| Relay | R | 0-199915(KV-7000/8000)/ 0-99915 (V2.2 之前) | 可省略 R 前綴 |
| Link relay | B | 0-7FFF | hex |
| Internal aux relay | MR | 0-399915(KV-7000/8000) | |
| Latch relay | LR | 0-99915 | |
| Control relay | CR | 0-7915 | |
| Timer | T | 0-3999 | |
| Counter | C | 0-3999 | |
| Work relay | VB | 0-F9FF | hex;僅 KV-7000/8000 |
| Data memory | DM | 0-65534 | |
| Extended data memory | EM | 0-65534 | |
| File register | FM | 0-32767 | |
| File register (extended) | ZF | 0-524287 | |
| Link register | W | 0-7FFF | hex |
| Temporary data memory | TM | 0-511 | |
| Index register | Z | 1-10(KV-X / 5/3000)/ Z01-Z12(KV-7/8000) | |
| Timer current value | TC | 0-3999 | |
| Timer set value | TS | 0-3999 | |
| Counter current value | CC | 0-3999 | |
| Counter set value | CS | 0-3999 | |
| Digital trimmer | AT | 0-7 | 僅 KV-7000/8000 |
| Control memory | CM | 0-7599(KV-8000) | KV-7000 範圍 0-5999 |
| Work memory | VM | 0-589823 | hex;僅 KV-7000/8000 |
Data format suffix
讀寫指令可用 suffix 指定資料格式:
| Suffix | 意義 |
|---|---|
.U | Decimal, 16-bit unsigned |
.S | Decimal, 16-bit signed |
.D | Decimal, 32-bit unsigned |
.L | Decimal, 32-bit signed |
.H | Hex, 16-bit |
| (none) | bit (relay 類)、.U (word 類) |
32-bit 資料 (
.D/.L) 只在 device No. 為偶數時保證原子性。
常用指令範例
讀單一 word
> RDS DM00000.S 1<CR>
< +12345<CR><LF>
讀 DM0 為 16-bit signed → 回 +12345。
讀連續 word(不同 format)
> RDS DM00200.S 3<CR>
< +15025 -25400 +00000<CR><LF>
> RDS DM00200.U 3<CR>
< 15025 40136 00000<CR><LF>
> RDS DM00200.H 3<CR>
< 3AB1 9CD8 0000<CR><LF>
讀位元
> RDS R00100 4<CR>
< 1 0 1 0<CR><LF>
R100 = ON, R101 = OFF, R102 = ON, R103 = OFF。
寫單一 word
> WRS DM00200.S 1 +12345<CR>
< OK<CR><LF>
寫連續 word
> WRS DM00200.S 3 +15025 -25400 +200<CR>
< OK<CR><LF>
寫位元
> WRS R00100 4 1 0 1 0<CR>
< OK<CR><LF>
強制設位元 ON
> ST MR 100<CR>
< OK<CR><LF>
切換 PLC 模式
> M1<CR> (切 RUN)
< OK<CR><LF>
> M0<CR> (切 PROGRAM)
< OK<CR><LF>
查機型
> ?K<CR>
< 57<CR><LF> (KV-8000)
設定時間
> WRT 24 05 06 14 30 25 1<CR>
< OK<CR><LF>
意思:2024 年 5 月 6 日 14:30:25 星期一(Mon=1)。
錯誤回應
所有指令失敗回應形式:E[code]<CR><LF>
| Code | 名稱 | 原因 | 對策 |
|---|---|---|---|
E0 | Abnormal device No. | device 號碼超出範圍 / 不存在 / 非 monitor 內 | 確認 device 號碼,必要時先 register monitor |
E1 | Abnormal command | 指令格式錯 / 不支援 | 比對指令格式 |
E2 | Program not registered | M1 切 RUN 但無 ladder 程式 | 先下載 ladder |
E4 | Write disabled | timer/counter set value 在 RUN 模式不可寫 | 切 PROGRAM 模式 |
E5 | Unit error | CPU 錯誤未清 | 先 ER 清除錯誤 |
E6 | No comments | 該 device 無註解 | 先在 KV STUDIO 設註解 |
XYM Expression(與 KEYENCE 表達式互換)
可用 Mitsubishi-style XYM 表達指定 device:
| KEYENCE 表達 | Mitsubishi XYM 表達 | XYM 範圍 |
|---|---|---|
R | X | 0000-1999F |
R | Y | 0000-1999F |
MR | M | 00000-63999 |
LR | L | 0000-999F |
DM | D | 00000-65534 |
EM | E | 00000-65534 |
FM | F | 00000-32767 |
.NET 實作建議
連線
using var tcp = new TcpClient();
await tcp.ConnectAsync("192.168.0.10", 8501);
using var stream = tcp.GetStream();
using var writer = new StreamWriter(stream, Encoding.ASCII) { NewLine = "\r" };
using var reader = new StreamReader(stream, Encoding.ASCII);
讀 word
await writer.WriteAsync("RDS DM00000.S 1\r");
await writer.FlushAsync();
var response = await reader.ReadLineAsync(); // 自動 strip CRLF
// response = " +12345"(注意前綴空白)
var value = short.Parse(response.Trim());
寫 word
await writer.WriteAsync($"WRS DM00200.S 1 {value:+0;-0;+0}\r");
await writer.FlushAsync();
var ack = await reader.ReadLineAsync();
if (ack?.Trim() != "OK")
throw new InvalidOperationException($"PLC error: {ack}");
讀位元
await writer.WriteAsync($"RDS R{address:D5} {count}\r");
await writer.FlushAsync();
var response = await reader.ReadLineAsync();
var bits = response.Trim().Split(' ').Select(s => s == "1").ToArray();
Telnet 直接 debug
Host Link 最大優勢:可用 telnet / putty 直接打指令測試。
Windows PowerShell
$client = New-Object System.Net.Sockets.TcpClient("192.168.0.10", 8501)
$stream = $client.GetStream()
$writer = New-Object System.IO.StreamWriter($stream)
$writer.NewLine = "`r"
$writer.AutoFlush = $true
$reader = New-Object System.IO.StreamReader($stream)
$writer.WriteLine("RDS DM00000.S 1")
$reader.ReadLine() # 看 PLC 回什麼
$writer.WriteLine("WRS DM00000.S 1 +123")
$reader.ReadLine() # OK
參考
- KV-XCM02 User's Manual Chapter 5(O24GB 版,2024-10)
- 相關文件: