跳到主要内容

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 / ClientKV PLC = server,PC = client
並發支援多 client 同時連線
場景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 modeMnn=0 切 PROGRAM 模式;n=1 切 RUN 模式
Clear errorER清除 CPU 錯誤
Check error No.?E查當前錯誤碼
Query model?K查 PLC 機型
Confirm operating mode?M查 RUN/PROGRAM 狀態
Time settingWRT設 RTC
Forced setST強制設位元 = 1
Forced resetRS強制設位元 = 0
Continuous forced setSTS連續多位元強制 = 1
Continuous forced resetRSS連續多位元強制 = 0
Data readRD讀單一 device
Consecutive data readRDS讀連續 device
Consecutive data read (compat)RDE與 KV-LE20A 相容(同 RDS)
Data writeWR寫單一 device
Write consecutive dataWRS寫連續 device
Write consecutive data (compat)WRE與 KV-LE20A 相容(同 WRS)
Write set valueWS寫 timer/counter set value
Write consecutive set valueWSS寫連續 timer/counter set value
Register monitorMBS / MWS註冊 bit / word 監視
Read monitorMBR / MWR讀已註冊監視值
Read commentsRDC讀 device comment
Bank switchingBE切換 file register bank
Read expansion buffer memoryURD讀擴充模組 buffer
Write expansion buffer memoryUWR寫擴充模組 buffer

機型查詢回應(?K 指令)

KV 機型回應 ASCIIHex
KV-X5506336H 33H
KV-X5306136H 31H
KV-X5206036H 30H
KV-X5006236H 32H
KV-X3105935H 39H
KV-80005735H 37H
KV-8000A5835H 38H
KV-73005435H 34H
KV-75005535H 35H
DeviceSymbol範圍備註
RelayR0-199915(KV-7000/8000)/ 0-99915 (V2.2 之前)可省略 R 前綴
Link relayB0-7FFFhex
Internal aux relayMR0-399915(KV-7000/8000)
Latch relayLR0-99915
Control relayCR0-7915
TimerT0-3999
CounterC0-3999
Work relayVB0-F9FFhex;僅 KV-7000/8000
Data memoryDM0-65534
Extended data memoryEM0-65534
File registerFM0-32767
File register (extended)ZF0-524287
Link registerW0-7FFFhex
Temporary data memoryTM0-511
Index registerZ1-10(KV-X / 5/3000)/ Z01-Z12(KV-7/8000)
Timer current valueTC0-3999
Timer set valueTS0-3999
Counter current valueCC0-3999
Counter set valueCS0-3999
Digital trimmerAT0-7僅 KV-7000/8000
Control memoryCM0-7599(KV-8000)KV-7000 範圍 0-5999
Work memoryVM0-589823hex;僅 KV-7000/8000

Data format suffix

讀寫指令可用 suffix 指定資料格式:

Suffix意義
.UDecimal, 16-bit unsigned
.SDecimal, 16-bit signed
.DDecimal, 32-bit unsigned
.LDecimal, 32-bit signed
.HHex, 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名稱原因對策
E0Abnormal device No.device 號碼超出範圍 / 不存在 / 非 monitor 內確認 device 號碼,必要時先 register monitor
E1Abnormal command指令格式錯 / 不支援比對指令格式
E2Program not registeredM1 切 RUN 但無 ladder 程式先下載 ladder
E4Write disabledtimer/counter set value 在 RUN 模式不可寫切 PROGRAM 模式
E5Unit errorCPU 錯誤未清ER 清除錯誤
E6No comments該 device 無註解先在 KV STUDIO 設註解

XYM Expression(與 KEYENCE 表達式互換)

可用 Mitsubishi-style XYM 表達指定 device:

KEYENCE 表達Mitsubishi XYM 表達XYM 範圍
RX0000-1999F
RY0000-1999F
MRM00000-63999
LRL0000-999F
DMD00000-65534
EME00000-65534
FMF00000-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

參考