MA-S1xx シリーズは Linux のほかに、OS としてNuttX を利用したファームウェアで運用することもできます。
NuttX を採用したファームウェアを使用すると、下記のようなメリットがあります。
実際のファームウェアサイズの例はこのようなサイズ感です。
[参考]
nuttx$ ls -l uImage -rw-rw-r-- 1 user user 1706160 2月 29 07:08 uImage
このファームウェアでは、下記のような処理を行っています。
上記のメリットに加えて、Nim 言語 での開発も可能になっているので、
となっています。
RTOS 向けとは思えないほどの少ないコードで記述できます。
import std/asyncdispatch
import std/httpclient
import std/json
import std/osproc
import std/strformat
proc post_harvest(data: seq[bool]) {.async.} =
let client = newAsyncHttpClient()
defer: client.close()
client.headers = newHttpHeaders({"Content-Type": "application/json"})
let body = %* {"data": data}
echo $body
try:
let resp = await client.request("http://harvest.soracom.io",
httpMethod = HttpPost, body = $body)
echo &"result: {resp.code}"
let resp_headers = resp.headers
for key, val in resp_headers.pairs:
echo &"key: {key} => value: {val}"
except:
let errmsg = getCurrentExceptionMsg()
echo &"error: {errmsg}"
import std/asyncdispatch
import std/strformat
import std/times
import nim_asyncmodbus
proc get_data(mb: ModbusRtu, address: uint8) {.async.} =
echo "--- Input Status"
let hregs = await mb.read_input_bits(address, 1.uint16, 8)
echo &"--- [{address}]: Input Bits -> count: {hregs.len}"
echo hregs
try:
await post_harvest(hregs)
except:
let errmsg = getCurrentExceptionMsg()
echo &"post_harvest: {errmsg}"
proc mb_task() {.async.} =
let mb = newModbusRtu("/dev/ttyFC1", 19200)
echo "mb instanciated."
discard mb.set_slave(2)
echo "set_slave() -> completed"
discard mb.connect()
echo "connected"
for i in 0 ..< 2:
let time_start = now()
await mb.get_data(2)
let time_end = now()
let elapsed = time_end - time_start
echo &"elapsed: {elapsed}"
await sleepAsync(100)
mb.close()