Modbus编程实现采集传感器数据和控制设备

任务:

编程实现采集传感器数据和控制硬件设备(传感器和硬件通过slave模拟)

传感器:2个,光线传感器、加速度传感器(x\y\z)

硬件设备:2个,led灯、蜂鸣器

要求:

  1. 多任务编程:多线程、多进程
  2. 循环1s采集一次数据,并将数据打印至终端
  3. 同时从终端输入指令控制硬件设备

                 0 1 :led灯打开

                0 0:led灯关闭

                1 1:蜂鸣器开

                1 0 : 蜂鸣器关

1.设置两个slave

ID=1, 功能码:01线圈

ID=1,功能码:03保持寄存器

 

 2.连接

连接成功图示:

#include <stdio.h>
#include <stdlib.h>
#include <modbus.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char const *argv[])
{
    modbus_t *ctx;
    uint16_t buf[64] = {};
    //1.以TCP方式创建Modbus实例,并初始化 ip地址和端口号502
    ctx = modbus_new_tcp(argv[1], atoi(argv[2]));
    if (ctx == NULL)
    {
        perror("modbus create err");
        return -1;
    }
    //2.设置从机ID
    int set_id = modbus_set_slave(ctx, 1);
    if (set_id != 0)
    {
        perror("set id err");
        return -1;
    }
    //3.和从机(slave)建立连接
    int con = modbus_connect(ctx);
    if (con != 0)
    {
        perror("connect err");
        return -1;
    }
    pid_t pid = fork();
    if (pid < 0)
    {
        perror("fork err");
        return -1;
    }
    else if (pid == 0)
    {
        while (1)
        {
            //4.寄存器操作 modbus实例 起始地址 寄存器个数 存储值
            modbus_read_registers(ctx, 0, 4, buf);
            for (int i = 0; i < 4; i++)
            {
                if (i == 0)
                {
                    printf("光线传感器数值");
                    printf("%d", buf[i]);
                    putchar(10);
                }
                else if (i == 1)
                {
                    printf("加速度传感器 x :%d \n", buf[i]);
                }
                else if (i == 2)
                {
                    printf("加速度传感器 y :%d \n", buf[i]);
                }
                else
                {
                    printf("加速度传感器 z :%d \n", buf[i]);
                }
            }
            putchar(10);
            sleep(5);
        }
        exit(0);
    }
    else
    {
        int a, b;
        while (1)
        {
            scanf("%d %d", &a, &b);
            if (a == 0 && b == 1)
            {
                printf("LED灯打开\n");
            }
            else if (a == 0 && b == 0)
            {
                printf("LED灯关闭\n");
            }
            else if (a == 1 && b == 1)
            {
                printf("蜂鸣器开\n");
            }
            else if (a == 1 && b == 0)
            {
                printf("蜂鸣器关\n");
            }
            modbus_write_bit(ctx, a, b);
        }
        //5.关闭套接字
        modbus_close(ctx);
        //6.释放实例
        modbus_free(ctx);
    }
    //wait(NULL);
    return 0;
}

 运行结果(./a.out   windows的ip地址  端口号:502)

 

猜你喜欢

转载自blog.csdn.net/m0_68672255/article/details/130414113