@takker/modbus
Modbus protocolを実装したjsr package features
ロジックと副作用を分離
通信部分の任意のものに変更できる
Usage
rootからread,writeをexport
Adaptor
code:ts
interface Adapter {
postMessage(data: Data, transfer?: Transferrable[]);
addEventListener: {
(type: "message", listener: (data: MessageEvent<any>) => void, options): void;
}
}
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
ReadabeStreamとWritableStreamのペアを受け取る?
readはcallbackのほうがいいかも
実装
これを上述した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の役割が被ってると思う。
これらの違いは何?そして前者を後者で置き換えることは可能か?