libmodbus是一个免费的跨平台的支持RTU和TCP的Modbus库。
首先我们访问libmodbus官方GitHub网站 https://github.com/stephane/libmodbus,下载源代码
下载完成后,解压下载的zip文件。
在使用VS编译之前,我么要双击configure.js文件生产config.h和modbus-version.h文件
我们使用vs打开该目录下的modbus-9.sln文件。
打开后有如下,点击确定。
完成项目升级文件。
此时如果直接编译工程文件,将发生错误。原因是其中新生成的文件modbus-version.h没有正确加载,在文件上单机右键选择移除,删除旧文件。
随后在Header Files上添加现有项,重新加载新生成的modbus-version.h文件。
再次尝试编译后发现会报错。
我们只要找到并删除version项的定义即可。右击modbus,选择属性。
删除版本号,重新编译。如果一切顺利,在win32目录下会成功生产modbus.dll和modbus.lib文件。
在工具栏上将工程文件目标属性切换到【release】项,按上面的方法重新编译Release版。
这样对于libmodbus库文件的编译完成。之后可以使用了。
之后在你需要调用的时候,在项目中添加modbus.dll文件,把该文件的“复制到输出目录”属性,改为“始终复制”。
之后在项目中新建一个类modbus.cs。我们需要声明对modbus里各个方法的调用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace KFTX1._0
{
public static class modbus
{
[DllImport("modbus.dll", EntryPoint = "modbus_new_rtu", CharSet = CharSet.Ansi)]
public static extern IntPtr modbus_new_rtu(string device, int baud, char parity, int data_bit, int stop_bit);//RTU模式创建的关联函数
[DllImport("modbus.dll", EntryPoint = "modbus_new_tcp", CharSet = CharSet.Ansi)]
public static extern IntPtr modbus_new_tcp(string device, int baud, char parity, int data_bit, int stop_bit);//TCP模式创建的关联函数
[DllImport("modbus.dll", EntryPoint = "modbus_set_slave", CharSet = CharSet.Ansi)]
public static extern int modbus_set_slave(IntPtr ctx,int slave);//共通的操作函数
[DllImport("modbus.dll", EntryPoint = "modbus_connect", CharSet = CharSet.Ansi)]
public static extern int modbus_connect(IntPtr ctx);
[DllImport("modbus.dll", EntryPoint = "modbus_read_bits", CharSet = CharSet.Ansi)]
public static extern int modbus_read_bits(IntPtr ctx, int addr,int nb,byte[] dest);
[DllImport("modbus.dll", EntryPoint = "modbus_read_input_bits", CharSet = CharSet.Ansi)]
public static extern int modbus_read_input_bits(IntPtr ctx, int addr, int nb, byte[] dest);
[DllImport("modbus.dll", EntryPoint = "modbus_read_registers", CharSet = CharSet.Ansi)]
public static extern int modbus_read_registers(IntPtr ctx, int addr, int nb, UInt16[] dest);
[DllImport("modbus.dll", EntryPoint = "modbus_read_input_registers", CharSet = CharSet.Ansi)]
public static extern int modbus_read_input_registers(IntPtr ctx, int addr, int nb, UInt16[] dest);
[DllImport("modbus.dll", EntryPoint = "modbus_write_bit", CharSet = CharSet.Ansi)]
public static extern int modbus_write_bit(IntPtr ctx, int coil_addr, int status);
[DllImport("modbus.dll", EntryPoint = "modbus_write_register", CharSet = CharSet.Ansi)]
public static extern int modbus_write_register(IntPtr ctx, int addr, int nb, UInt16[] dest);
[DllImport("modbus.dll", EntryPoint = "modbus_write_bits", CharSet = CharSet.Ansi)]
public static extern int modbus_write_bits(IntPtr ctx, int coil_addr, int nb, byte[] status);
[DllImport("modbus.dll", EntryPoint = "modbus_write_registers", CharSet = CharSet.Ansi)]
public static extern int modbus_write_registers(IntPtr ctx, int reg_addr,int nb, UInt16[] status);
[DllImport("modbus.dll", EntryPoint = "modbus_write_and_read_registers", CharSet = CharSet.Ansi)]
public static extern int modbus_write_and_read_registers(IntPtr ctx, int write_addr, int write_nb, UInt16[] scr,
int read_addr, int read_nb, UInt16[] dest);
[DllImport("modbus.dll", EntryPoint = "modbus_close", CharSet = CharSet.Ansi)]
public static extern void modbus_close(IntPtr ctx);
[DllImport("modbus.dll", EntryPoint = "modbus_free", CharSet = CharSet.Ansi)]
public static extern void modbus_free(IntPtr ctx);
}
}
之后既可以调用modbus里的各个方法。