@takker/modbus
Modbus protocolを実装したjsr package
https://github.com/takker99/modbus-js
features
ロジックと副作用を分離
npm:modbus-serialなどはロジックと副作用が密結合している
通信部分の任意のものに変更できる
Usage
rootからread,writeをexport
Adaptor
MessagePort likeにする
comlinkを参考にした
code:ts
interface Adapter {
postMessage(data: Data, transfer?: Transferrable[]);
addEventListener: {
(type: "message", listener: (data: MessageEvent<any>) => void, options): void;
}
}
removeは、optionsにAbortSignalを渡して実現する
すぐ使いやすいよう、Web serial APIとserialportのadaptorを作るhelper functionをsub moduleからexportする
code:ts
import { read, write } from "jsr:@takker/modbus";
import { createWebSerialAdaptor } from "jsr:@takker/modbus/web-serial";
{
await using adaptor = createWebSerialAdaptor(serialPort)
const result = await read(adaptor, 3, data);
await write(adaptor, 3, data);
// close connection
}
2025-09-03 01:04:37 readableのほうがやっぱりいいかも
Uint8ArrayはReadableStream<Uint8Array>でとるのがらく
TransformStreamでPDUに変換する
変換後にaddEventListenerなどに一つのeventとしてdispatchすればいい
addEventListenerが便利なのはこの段階
ReadableStream<Uint8Array>はFrameごとに別れているとは限らないので、この段階ではむしろWeb Stream APIの技術で変換したほうが楽
jsr packageとしてlogicだけつくりたいtakker.icon
crc16は内蔵、いずれ@takker/crcに入れる
ReadabeStreamとWritableStreamのペアを受け取る?
readはcallbackのほうがいいかも
https://github.com/copilot/share/820653ba-4964-8884-8813-8608047a0056
実装
modbus-web-monitorでだいぶ整理したコードを実装できた
これを上述したAPIに修正して、Denoに移植する
code:md
APIの変更を行う
1. timeoutを使っているすべての関数、クラスを、AbortSignalを受け取って中断できるよう変更して。
2. IModbusTransportの部分を、EventEmitterではなく以下のようなMessagePort-likeな設計に変更する
`ts
interface IModbusTransport {
postMessage(data: Data, transfer?: Transferrable[]);
addEventListener(type: "message", listener: (data: MessageEvent<any>) => void, options?: AddEventListenerOptions): void;
}
`
postMessageとaddEventListenerの型はあくまで試案である。必要なら適宜変更、およびpropsを追加してかまわない。
removeEventListenerは実装不要とする (addEventListenerのoptionsにAbortSignalを渡せば同じことを実現できるので)
code:md
api/rtc.tsとmodbus-rtc.ts, src/ascii.tsとmodbus-ascii.tsの役割が被ってると思う。
これらの違いは何?そして前者を後者で置き換えることは可能か?
#2025-09-03 01:06:06
#2025-09-01 11:47:14