Files
neuron/tests/modbus_point_test.cc
T
fengzero 370aed5e2d modbus tcp: add cycle read
del demo code
use aio timeout as timer
2021-09-15 19:00:14 +08:00

533 lines
20 KiB
C++

#include <netinet/in.h>
#include <gtest/gtest.h>
#include "modbus/modbus_point.h"
TEST(ModbusPointTest, AddPoint)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400001", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!300001", MODBUS_B32));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!000002", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!000001", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!100001", MODBUS_B8));
EXPECT_EQ(-1, modbus_point_add(ctx, (char *) "1!100001", MODBUS_B16));
EXPECT_EQ(-1, modbus_point_add(ctx, (char *) "1!100001", MODBUS_B32));
EXPECT_EQ(-1, modbus_point_add(ctx, (char *) "1!000001", MODBUS_B16));
EXPECT_EQ(-1, modbus_point_add(ctx, (char *) "1!000001", MODBUS_B32));
modbus_point_destory(ctx);
}
TEST(ModbusPointTest, NewSameDeviceCmd)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400001", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!300001", MODBUS_B32));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!000002", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!000001", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!100001", MODBUS_B8));
modbus_point_new_cmd(ctx);
EXPECT_EQ(4, modbus_point_get_cmd_size(ctx));
modbus_point_destory(ctx);
}
TEST(ModbusPointTest, NewSameAddrCmd)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400001", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!300001", MODBUS_B32));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400003", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400004", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400007", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!000002", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!000001", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!100001", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!000003", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400008", MODBUS_B16));
modbus_point_new_cmd(ctx);
EXPECT_EQ(5, modbus_point_get_cmd_size(ctx));
modbus_point_destory(ctx);
}
TEST(ModbusPointTest, NewCmd)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "2!400001", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!300001", MODBUS_B32));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400003", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "2!400002", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400004", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "3!400007", MODBUS_B16));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "5!000002", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!000001", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!100001", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!000003", MODBUS_B8));
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!400008", MODBUS_B16));
modbus_point_new_cmd(ctx);
EXPECT_EQ(10, modbus_point_get_cmd_size(ctx));
modbus_point_destory(ctx);
}
static ssize_t read_error(void *arg, char *send_buf, ssize_t send_len,
char *recv_buf, ssize_t recv_len)
{
return -1;
}
TEST(ModbusPointTest, ReadPointError)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!300001", MODBUS_B32));
modbus_point_new_cmd(ctx);
EXPECT_EQ(1, modbus_point_get_cmd_size(ctx));
EXPECT_EQ(-1, modbus_point_all_read(ctx, true, read_error));
modbus_point_destory(ctx);
}
static ssize_t write_coil_ok(void *arg, char *send_buf, ssize_t send_len,
char *recv_buf, ssize_t recv_len)
{
EXPECT_EQ(arg, (void *) NULL);
EXPECT_EQ(send_len,
sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_m_write_request) + 1);
struct modbus_header *header = (struct modbus_header *) send_buf;
struct modbus_code * code = (struct modbus_code *) &header[1];
struct modbus_pdu_m_write_request *request =
(struct modbus_pdu_m_write_request *) &code[1];
uint8_t *data = (uint8_t *) &request[1];
EXPECT_EQ(header->process_no, 0);
EXPECT_EQ(header->flag, 0);
EXPECT_EQ(htons(header->len), send_len - sizeof(struct modbus_header));
EXPECT_EQ(code->device_address, 1);
EXPECT_EQ(code->function_code, MODBUS_WRITE_M_COIL);
EXPECT_EQ(htons(request->n_reg), 1);
EXPECT_EQ(request->n_byte, 1);
header = (struct modbus_header *) recv_buf;
code = (struct modbus_code *) &header[1];
struct modbus_pdu_write_response *response =
(struct modbus_pdu_write_response *) &code[1];
header->process_no = 0;
header->flag = 0;
header->len = htons(sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_write_response));
code->device_address = 1;
code->function_code = MODBUS_WRITE_M_COIL;
response->start_addr = 0;
response->n_reg = htons(1);
return sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_write_response);
}
TEST(ModbusPointTest, WriteCoilPoint)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
modbus_data_t data;
data.type = MODBUS_B8;
data.val.val_u8 = 1;
EXPECT_EQ(
0, modbus_point_write((char *) "1!00001", &data, write_coil_ok, NULL));
modbus_point_destory(ctx);
}
static ssize_t write_hold16_ok(void *arg, char *send_buf, ssize_t send_len,
char *recv_buf, ssize_t recv_len)
{
EXPECT_EQ(arg, (void *) NULL);
EXPECT_EQ(send_len,
sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_m_write_request) + 2);
struct modbus_header *header = (struct modbus_header *) send_buf;
struct modbus_code * code = (struct modbus_code *) &header[1];
struct modbus_pdu_m_write_request *request =
(struct modbus_pdu_m_write_request *) &code[1];
uint8_t *data = (uint8_t *) &request[1];
EXPECT_EQ(header->process_no, 0);
EXPECT_EQ(header->flag, 0);
EXPECT_EQ(htons(header->len), send_len - sizeof(struct modbus_header));
EXPECT_EQ(code->device_address, 1);
EXPECT_EQ(code->function_code, MODBUS_WRITE_M_HOLD_REG);
EXPECT_EQ(htons(request->n_reg), 1);
EXPECT_EQ(request->n_byte, 2);
header = (struct modbus_header *) recv_buf;
code = (struct modbus_code *) &header[1];
struct modbus_pdu_write_response *response =
(struct modbus_pdu_write_response *) &code[1];
header->process_no = 0;
header->flag = 0;
header->len = htons(sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_write_response));
code->device_address = 1;
code->function_code = MODBUS_WRITE_M_HOLD_REG;
response->start_addr = 0;
response->n_reg = htons(1);
return sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_write_response);
}
TEST(ModbusPointTest, WriteHold16Point)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
modbus_data_t data;
data.type = MODBUS_B16;
data.val.val_u16 = 1;
EXPECT_EQ(
0,
modbus_point_write((char *) "1!40001", &data, write_hold16_ok, NULL));
modbus_point_destory(ctx);
}
static ssize_t write_hold32_ok(void *arg, char *send_buf, ssize_t send_len,
char *recv_buf, ssize_t recv_len)
{
EXPECT_EQ(arg, (void *) NULL);
EXPECT_EQ(send_len,
sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_m_write_request) + 4);
struct modbus_header *header = (struct modbus_header *) send_buf;
struct modbus_code * code = (struct modbus_code *) &header[1];
struct modbus_pdu_m_write_request *request =
(struct modbus_pdu_m_write_request *) &code[1];
uint8_t *data = (uint8_t *) &request[1];
EXPECT_EQ(header->process_no, 0);
EXPECT_EQ(header->flag, 0);
EXPECT_EQ(htons(header->len), send_len - sizeof(struct modbus_header));
EXPECT_EQ(code->device_address, 1);
EXPECT_EQ(code->function_code, MODBUS_WRITE_M_HOLD_REG);
EXPECT_EQ(htons(request->n_reg), 2);
EXPECT_EQ(request->n_byte, 4);
header = (struct modbus_header *) recv_buf;
code = (struct modbus_code *) &header[1];
struct modbus_pdu_write_response *response =
(struct modbus_pdu_write_response *) &code[1];
header->process_no = 0;
header->flag = 0;
header->len = htons(sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_write_response));
code->device_address = 1;
code->function_code = MODBUS_WRITE_M_HOLD_REG;
response->start_addr = 0;
response->n_reg = htons(2);
return sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_write_response);
}
TEST(ModbusPointTest, WriteHold32Point)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
modbus_data_t data;
data.type = MODBUS_B32;
data.val.val_u32 = 1;
EXPECT_EQ(
0,
modbus_point_write((char *) "1!40001", &data, write_hold32_ok, NULL));
modbus_point_destory(ctx);
}
static ssize_t read_coil(void *arg, char *send_buf, ssize_t send_len,
char *recv_buf, ssize_t recv_len)
{
EXPECT_EQ(arg, (void *) NULL);
EXPECT_EQ(send_len,
sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_request));
struct modbus_header * header = (struct modbus_header *) send_buf;
struct modbus_code * code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_request *request =
(struct modbus_pdu_read_request *) &code[1];
EXPECT_EQ(htons(header->process_no), 1);
EXPECT_EQ(header->flag, 0);
EXPECT_EQ(htons(header->len), send_len - sizeof(struct modbus_header));
EXPECT_EQ(code->device_address, 1);
EXPECT_EQ(code->function_code, MODBUS_READ_COIL);
EXPECT_EQ(htons(request->start_addr), 0);
EXPECT_EQ(htons(request->n_reg), 1);
header = (struct modbus_header *) recv_buf;
code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_response *response =
(struct modbus_pdu_read_response *) &code[1];
header->process_no = htons(1);
header->flag = 0;
header->len = htons(sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 1);
code->device_address = 1;
code->function_code = MODBUS_READ_COIL;
response->n_byte = htons(1);
return sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 1;
}
TEST(ModbusPointTest, ReadCoilPoint)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!00001", MODBUS_B8));
modbus_point_new_cmd(ctx);
EXPECT_EQ(1, modbus_point_get_cmd_size(ctx));
EXPECT_EQ(0, modbus_point_all_read(ctx, true, read_coil));
modbus_point_destory(ctx);
}
static ssize_t read_input(void *arg, char *send_buf, ssize_t send_len,
char *recv_buf, ssize_t recv_len)
{
EXPECT_EQ(arg, (void *) NULL);
EXPECT_EQ(send_len,
sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_request));
struct modbus_header * header = (struct modbus_header *) send_buf;
struct modbus_code * code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_request *request =
(struct modbus_pdu_read_request *) &code[1];
EXPECT_EQ(htons(header->process_no), 1);
EXPECT_EQ(header->flag, 0);
EXPECT_EQ(htons(header->len), send_len - sizeof(struct modbus_header));
EXPECT_EQ(code->device_address, 1);
EXPECT_EQ(code->function_code, MODBUS_READ_INPUT_CONTACT);
EXPECT_EQ(htons(request->start_addr), 0);
EXPECT_EQ(htons(request->n_reg), 1);
header = (struct modbus_header *) recv_buf;
code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_response *response =
(struct modbus_pdu_read_response *) &code[1];
header->process_no = htons(1);
header->flag = 0;
header->len = htons(sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 1);
code->device_address = 1;
code->function_code = MODBUS_READ_INPUT_CONTACT;
response->n_byte = htons(1);
return sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 1;
}
TEST(ModbusPointTest, ReadInputPoint)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!10001", MODBUS_B8));
modbus_point_new_cmd(ctx);
EXPECT_EQ(1, modbus_point_get_cmd_size(ctx));
EXPECT_EQ(0, modbus_point_all_read(ctx, true, read_input));
modbus_point_destory(ctx);
}
static ssize_t read_hold_register16(void *arg, char *send_buf, ssize_t send_len,
char *recv_buf, ssize_t recv_len)
{
EXPECT_EQ(arg, (void *) NULL);
EXPECT_EQ(send_len,
sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_request));
struct modbus_header * header = (struct modbus_header *) send_buf;
struct modbus_code * code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_request *request =
(struct modbus_pdu_read_request *) &code[1];
EXPECT_EQ(htons(header->process_no), 1);
EXPECT_EQ(header->flag, 0);
EXPECT_EQ(htons(header->len), send_len - sizeof(struct modbus_header));
EXPECT_EQ(code->device_address, 1);
EXPECT_EQ(code->function_code, MODBUS_READ_HOLD_REG);
EXPECT_EQ(htons(request->start_addr), 0);
EXPECT_EQ(htons(request->n_reg), 1);
header = (struct modbus_header *) recv_buf;
code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_response *response =
(struct modbus_pdu_read_response *) &code[1];
header->process_no = htons(1);
header->flag = 0;
header->len = htons(sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 2);
code->device_address = 1;
code->function_code = MODBUS_READ_HOLD_REG;
response->n_byte = htons(2);
return sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 2;
}
TEST(ModbusPointTest, ReadHoldRegister16Point)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!40001", MODBUS_B16));
modbus_point_new_cmd(ctx);
EXPECT_EQ(1, modbus_point_get_cmd_size(ctx));
EXPECT_EQ(0, modbus_point_all_read(ctx, true, read_hold_register16));
modbus_point_destory(ctx);
}
static ssize_t read_hold_register32(void *arg, char *send_buf, ssize_t send_len,
char *recv_buf, ssize_t recv_len)
{
EXPECT_EQ(arg, (void *) NULL);
EXPECT_EQ(send_len,
sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_request));
struct modbus_header * header = (struct modbus_header *) send_buf;
struct modbus_code * code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_request *request =
(struct modbus_pdu_read_request *) &code[1];
EXPECT_EQ(htons(header->process_no), 1);
EXPECT_EQ(header->flag, 0);
EXPECT_EQ(htons(header->len), send_len - sizeof(struct modbus_header));
EXPECT_EQ(code->device_address, 1);
EXPECT_EQ(code->function_code, MODBUS_READ_HOLD_REG);
EXPECT_EQ(htons(request->start_addr), 0);
EXPECT_EQ(htons(request->n_reg), 2);
header = (struct modbus_header *) recv_buf;
code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_response *response =
(struct modbus_pdu_read_response *) &code[1];
header->process_no = htons(1);
header->flag = 0;
header->len = htons(sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 4);
code->device_address = 1;
code->function_code = MODBUS_READ_HOLD_REG;
response->n_byte = htons(4);
return sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 4;
}
TEST(ModbusPointTest, ReadHoldRegister32Point)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!40001", MODBUS_B32));
modbus_point_new_cmd(ctx);
EXPECT_EQ(1, modbus_point_get_cmd_size(ctx));
EXPECT_EQ(0, modbus_point_all_read(ctx, true, read_hold_register32));
modbus_point_destory(ctx);
}
static ssize_t read_input_register(void *arg, char *send_buf, ssize_t send_len,
char *recv_buf, ssize_t recv_len)
{
EXPECT_EQ(arg, (void *) NULL);
EXPECT_EQ(send_len,
sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_request));
struct modbus_header * header = (struct modbus_header *) send_buf;
struct modbus_code * code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_request *request =
(struct modbus_pdu_read_request *) &code[1];
EXPECT_EQ(htons(header->process_no), 1);
EXPECT_EQ(header->flag, 0);
EXPECT_EQ(htons(header->len), send_len - sizeof(struct modbus_header));
EXPECT_EQ(code->device_address, 1);
EXPECT_EQ(code->function_code, MODBUS_READ_INPUT_REG);
EXPECT_EQ(htons(request->start_addr), 0);
EXPECT_EQ(htons(request->n_reg), 1);
header = (struct modbus_header *) recv_buf;
code = (struct modbus_code *) &header[1];
struct modbus_pdu_read_response *response =
(struct modbus_pdu_read_response *) &code[1];
header->process_no = htons(1);
header->flag = 0;
header->len = htons(sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 2);
code->device_address = 1;
code->function_code = MODBUS_READ_INPUT_REG;
response->n_byte = htons(2);
return sizeof(struct modbus_header) + sizeof(struct modbus_code) +
sizeof(struct modbus_pdu_read_response) + 2;
}
TEST(ModbusPointTest, ReadInputRegisterPoint)
{
modbus_point_context_t *ctx = modbus_point_init(NULL);
EXPECT_EQ(0, modbus_point_add(ctx, (char *) "1!30001", MODBUS_B16));
modbus_point_new_cmd(ctx);
EXPECT_EQ(1, modbus_point_get_cmd_size(ctx));
EXPECT_EQ(0, modbus_point_all_read(ctx, true, read_input_register));
modbus_point_destory(ctx);
}