センサーデータを収集し、機器を制御するための Modbus プログラミング

タスク:

センサーデータを収集し、ハードウェアデバイスを制御するためのプログラミング (センサーとハードウェアはスレーブによってシミュレートされます)

センサー: 2、光センサー、加速度センサー (x\y\z)

ハードウェア装備:2、LEDライト、ブザー

必須:

  1. マルチタスクプログラミング: マルチスレッド、マルチプロセッシング
  2. 1秒周期でデータを収集し、端末に出力
  3. 同時にターミナルからコマンドを入力してハードウェアデバイスを制御します

                 0 1 : LEDライトが点灯します

                0 0: LED ライトがオフ

                1 1: ブザーオン

                1 0 : ブザーオフ

1. 2 台のスレーブをセットアップする

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