一、编译libmodbus库,vs2015
二、将头文件,lib,dll拷贝到 项目下
引入lib库到工程中 - - C++博客 (cppblog.com)
添加到项目并引用头文件。代码添加库。
MFC 在VS中添加lib的三种方法_lgqlovexl的博客-CSDN博客_mfc 添加lib
MFC添加lib文件、静态库三种方法_走好每一步的博客-CSDN博客_mfc 使用lib
源码:
// libmodbus_use.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <iostream>
#include "modbus.h"
#ifdef _DEBUG
#pragma comment(lib,"modbusD.lib")
#else
#pragma comment(lib,"modbusD.lib")
#endif
#define LOOP 1
#define SERVER_ID 1
#define ADDRESS_START 0
#define ADDRESS_END 99
int main()
{//random-test-client.c https://github.com/stephane/libmodbus/tree/master/tests
modbus_t* ctx;//modbus实例
int rc;//返回数
int nb_fail;//失败次数
int nb_loop;//循环次数
int addr;//地址
int nb;//数量
uint8_t* tab_rq_bits;
uint8_t* tab_rp_bits;
uint16_t* tab_rq_registers;
uint16_t* tab_rw_rq_registers;
uint16_t* tab_rp_registers;
/* RTU */
/*
ctx = modbus_new_rtu("/dev/ttyUSB0", 19200, 'N', 8, 1);
modbus_set_slave(ctx, SERVER_ID);
*/
/* TCP */
ctx = modbus_new_tcp("127.0.0.1", 502);
modbus_set_debug(ctx, TRUE);
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n",
modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
/* Allocate and initialize the different memory spaces */
nb = ADDRESS_END - ADDRESS_START;//地址数量
tab_rq_bits = (uint8_t*)malloc(nb * sizeof(uint8_t));// 99个字节
memset(tab_rq_bits, 0, nb * sizeof(uint8_t));//分配位写入请求内存
tab_rp_bits = (uint8_t*)malloc(nb * sizeof(uint8_t));//99个字节
memset(tab_rp_bits, 0, nb * sizeof(uint8_t));//分配位读取响应内存
tab_rq_registers = (uint16_t*)malloc(nb * sizeof(uint16_t));//寄存器写入请求内存
memset(tab_rq_registers, 0, nb * sizeof(uint16_t));//99个ushort缓存
tab_rp_registers = (uint16_t*)malloc(nb * sizeof(uint16_t));//99个ushortr
memset(tab_rp_registers, 0, nb * sizeof(uint16_t));//分配寄存器读取响应内存
tab_rw_rq_registers = (uint16_t*)malloc(nb * sizeof(uint16_t));//99个ushortr
memset(tab_rw_rq_registers, 0, nb * sizeof(uint16_t));
nb_loop = nb_fail = 0;
while (nb_loop++ < LOOP) {//执行1次循环
for (addr = ADDRESS_START; addr < ADDRESS_END; addr++) {//遍历地址0~99
int i;
/* Random numbers (short) 随机短整型数字 */
for (i = 0; i < nb; i++) {
tab_rq_registers[i] = (uint16_t)(65535.0 * rand() / (RAND_MAX + 1.0));//随机无符号短整型
tab_rw_rq_registers[i] = ~tab_rq_registers[i];//取反
tab_rq_bits[i] = tab_rq_registers[i] % 2;//0、1
}
nb = ADDRESS_END - addr;//未写入的地址数量
/* WRITE BIT 写入一位 */
rc = modbus_write_bit(ctx, addr, tab_rq_bits[0]);//
if (rc != 1) {//位写入错误
printf("ERROR modbus_write_bit (%d)\n", rc);
printf("Address = %d, value = %d\n", addr, tab_rq_bits[0]);
nb_fail++;
}
else {//写入OK,进行读取
rc = modbus_read_bits(ctx, addr, 1, tab_rp_bits);
if (rc != 1 || tab_rq_bits[0] != tab_rp_bits[0]) {//读取失败或者 请求写入的数据与 读取响应的位数据不一致
printf("ERROR modbus_read_bits single (%d)\n", rc);
printf("address = %d\n", addr);
nb_fail++;
}
}
/* MULTIPLE BITS 多个位 写入、读取*/
rc = modbus_write_bits(ctx, addr, nb, tab_rq_bits);//
if (rc != nb) {//写入错误
printf("ERROR modbus_write_bits (%d)\n", rc);
printf("Address = %d, nb = %d\n", addr, nb);
nb_fail++;
}
else {//读取多位
rc = modbus_read_bits(ctx, addr, nb, tab_rp_bits);
if (rc != nb) {//读取数量错误
printf("ERROR modbus_read_bits\n");
printf("Address = %d, nb = %d\n", addr, nb);
nb_fail++;
}
else {//读取正确
for (i = 0; i < nb; i++) {
if (tab_rp_bits[i] != tab_rq_bits[i]) {
printf("ERROR modbus_read_bits\n");
printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
addr, tab_rq_bits[i], tab_rq_bits[i],
tab_rp_bits[i], tab_rp_bits[i]);
nb_fail++;
}
}
}
}
/* SINGLE REGISTER 单寄存器 写入 读取*/
rc = modbus_write_register(ctx, addr, tab_rq_registers[0]);//写入uint_16
if (rc != 1) {
printf("ERROR modbus_write_register (%d)\n", rc);
printf("Address = %d, value = %d (0x%X)\n",
addr, tab_rq_registers[0], tab_rq_registers[0]);
nb_fail++;
}
else {
rc = modbus_read_registers(ctx, addr, 1, tab_rp_registers);//读取uint_16
if (rc != 1) {
printf("ERROR modbus_read_registers single (%d)\n", rc);
printf("Address = %d\n", addr);
nb_fail++;
}
else {
if (tab_rq_registers[0] != tab_rp_registers[0]) {//写入请求与读取响应不一致
printf("ERROR modbus_read_registers single\n");
printf("Address = %d, value = %d (0x%X) != %d (0x%X)\n",
addr, tab_rq_registers[0], tab_rq_registers[0],
tab_rp_registers[0], tab_rp_registers[0]);
nb_fail++;//失败次数
}
}
}
/* MULTIPLE REGISTERS 多寄存器 写入、读取 */
rc = modbus_write_registers(ctx, addr, nb, tab_rq_registers);//写入多个uint_16
if (rc != nb) {
printf("ERROR modbus_write_registers (%d)\n", rc);
printf("Address = %d, nb = %d\n", addr, nb);
nb_fail++;
}
else {
rc = modbus_read_registers(ctx, addr, nb, tab_rp_registers);//读取多个短整型
if (rc != nb) {
printf("ERROR modbus_read_registers (%d)\n", rc);
printf("Address = %d, nb = %d\n", addr, nb);
nb_fail++;
}
else {
for (i = 0; i < nb; i++) {//遍历每个数,比较 请求与响应是否一致
if (tab_rq_registers[i] != tab_rp_registers[i]) {
printf("ERROR modbus_read_registers\n");
printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
addr, tab_rq_registers[i], tab_rq_registers[i],
tab_rp_registers[i], tab_rp_registers[i]);
nb_fail++;
}
}
}
}
/* R/W MULTIPLE REGISTERS 同时写读多个寄存器*/
rc = modbus_write_and_read_registers(ctx,
addr, nb, tab_rw_rq_registers,
addr, nb, tab_rp_registers);//tab_rw_rq_registers 要写入的请求数据 tab_rp_registers读取的响应数据
if (rc != nb) {
printf("ERROR modbus_read_and_write_registers (%d)\n", rc);
printf("Address = %d, nb = %d\n", addr, nb);
nb_fail++;
}
else {//写入、读取ok
for (i = 0; i < nb; i++) {
if (tab_rp_registers[i] != tab_rw_rq_registers[i]) {//请求写入的和读取的响应数据是否一致
printf("ERROR modbus_read_and_write_registers READ\n");
printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
addr, tab_rp_registers[i], tab_rw_rq_registers[i],
tab_rp_registers[i], tab_rw_rq_registers[i]);//不一致则输出
nb_fail++;
}
}
rc = modbus_read_registers(ctx, addr, nb, tab_rp_registers);//再次读取
if (rc != nb) {
printf("ERROR modbus_read_registers (%d)\n", rc);
printf("Address = %d, nb = %d\n", addr, nb);
nb_fail++;
}
else {//读取成功
for (i = 0; i < nb; i++) {
if (tab_rw_rq_registers[i] != tab_rp_registers[i]) {//再次比较请求写入的数据与 读取的响应是否一致
printf("ERROR modbus_read_and_write_registers WRITE\n");
printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
addr, tab_rw_rq_registers[i], tab_rw_rq_registers[i],
tab_rp_registers[i], tab_rp_registers[i]);
nb_fail++;//失败次数
}
}
}
}
}
printf("Test: ");
if (nb_fail)
printf("%d FAILS\n", nb_fail);//打印失败次数
else
printf("SUCCESS\n");
}
/* Free the memory 释放内存 */
free(tab_rq_bits);
free(tab_rp_bits);
free(tab_rq_registers);
free(tab_rp_registers);
free(tab_rw_rq_registers);
/* Close the connection 关闭连接*/
modbus_close(ctx);
modbus_free(ctx);
//std::cout << "Hello World!\n";
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件