Hi,
Anyone know of a Nim Modbus TCP library? Or maybe a good C Modbus TCP library? I'll port it, I just don't know any good ones.
Thanks, Matic
Never finished it, no. And that was 2 years ago.
Your best bet is c2nim and https://github.com/stephane/libmodbus
Couldn't resist - here's a modbus wrapper based on v0.2.0 of nimterop still in test.
For dynamically linking to libmodbus.so:
nim c -d:modbusGit modbus.nim
For static linking:
nim c -d:modbusGit -d:modbusStatic modbus.nim
import os, strutils
import nimterop/[build, cimport]
const
baseDir = currentSourcePath.parentDir()/"build/libmodbus"
static:
cDebug()
getHeader(
"modbus.h",
giturl = "https://github.com/stephane/libmodbus",
outdir = baseDir,
conFlags = "--enable-static=yes --disable-tests"
)
cPlugin:
import strutils
proc onSymbol*(sym: var Symbol) {.exportc, dynlib.} =
sym.name = sym.name.strip(chars = {'_'})
cOverride:
type
modbus = object
when not defined(modbusStatic):
cImport(modbusPath, recurse = true, dynlib = "modbusLPath")
else:
cImport(modbusPath, recurse = true)
@shashlick I just tried it nim c -d:modbusGit modbus.nim on Windows and get:
Hint: plugin [Processing]
Hint: paths [Processing]
Hint: types [Processing]
# Setting up Git repo: https://github.com/stephane/libmodbus
# Pulling repository
stack trace: (most recent call last)
...\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(575, 32)
...\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(497, 11) buildLibrary
C:\Nim\lib\system\assertions.nim(27, 20) failedAssertImpl
C:\Nim\lib\system\assertions.nim(20, 11) raiseAssert
C:\Nim\lib\system\fatal.nim(39, 5) sysFatal
C:\libmodbus_test\modbus.nim(11, 10) template/generic instantiation of `getHeader` from here
C:\Nim\lib\system\fatal.nim(39, 5) Error: unhandled exception: ...\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(497, 12) `cmakeDeps or conDeps`
# Build configuration failed - No build files found in C:\libmodbus_test\build\libmodbus
[AssertionError]
Press any key to continue . . .
Plus, the libmodbus source gets cloned into the nimterop nimble directory.What version of Nim are you using? I tried this on Windows and it worked just fine.
Did you change currentSourcePath()? Also, how did you install nimterop?
Note that libmodbus does not build the shared library on Windows with mingw-x64 since it cannot find -lws2_32 for some reason. However, I could get the -d:modbusStatic version to work.
I tried the static build now with nim c -d:modbusGit -d:modbusStatic modbus.nim.
What version of Nim are you using? devel (couple of days old) on Windows 10 x64
Also, how did you install nimterop? Manually cloned nimterop branch v020 from github and ran nimble install.
Did you change currentSourcePath()? Tried currentSourcePath() and a fixed path, both throw:
Hint: paths [Processing]
Hint: types [Processing]
# Setting up Git repo: https://github.com/stephane/libmodbus
# Pulling repository
stack trace: (most recent call last)
C:\Users\matic\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(575, 32)
C:\Users\matic\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(497, 11) buildLibrary
C:\Nim\lib\system\assertions.nim(27, 20) failedAssertImpl
C:\Nim\lib\system\assertions.nim(20, 11) raiseAssert
C:\Nim\lib\system\fatal.nim(39, 5) sysFatal
D:\VISTA_NAMIZJE\NIM\testing\libmodbus\modbus.nim(12, 10) template/generic instantiation of `getHeader` from here
C:\Nim\lib\system\fatal.nim(39, 5) Error: unhandled exception: C:\Users\matic\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(497, 12) `cmakeDeps or conDeps`
# Build configuration failed - No build files found in D:/VISTA_NAMIZJE/NIM/testing/libmodbus/build/libmodbus/
[AssertionError]
If I manually clone the libmodbus into .../build/libmodbus I get:
Hint: paths [Processing]
Hint: types [Processing]
# Resetting D:/VISTA_NAMIZJE/NIM/testing/libmodbus/build/libmodbus/
stack trace: (most recent call last)
C:\Users\matic\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(569, 23)
C:\Users\matic\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(383, 10) getGitPath
C:\Users\matic\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(169, 13) gitPull
C:\Users\matic\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(140, 19) gitReset
C:\Users\matic\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(27, 11) execAction
C:\Nim\lib\system\assertions.nim(27, 20) failedAssertImpl
C:\Nim\lib\system\assertions.nim(20, 11) raiseAssert
C:\Nim\lib\system\fatal.nim(39, 5) sysFatal
D:\VISTA_NAMIZJE\NIM\testing\libmodbus\modbus.nim(12, 10) template/generic instantiation of `getHeader` from here
C:\Nim\lib\system\fatal.nim(39, 5) Error: unhandled exception: C:\Users\matic\.nimble\pkgs\nimterop-0.1.0\nimterop\build.nim(27, 12) `ret == 0` Command failed: (128, false)
ccmd: cmd /c cd D:/VISTA_NAMIZJE/NIM/testing/libmodbus/build/libmodbus/ && git reset --hard
result:
fatal: not a git repository (or any of the parent directories): .git
[AssertionError]
What version of Windows are you using? Cause I'm unable to reproduce this. I suspect it could be the / instead of \\ throwing off cmd but you'd get a different error then.
Also, feel free to jump on https://gitter.im/nimterop/Lobby - will probably be faster to debug.