当前位置:
求助:COM口支持232422485修改成485模式不成功,什么原因
回复 | 人气 | 打印
wznjupt 个人主页 给TA发消息 加TA为好友 发表于:2019-07-18 17:01:23 楼主

目前用的是研华工控机,和继电器485 A  B 连接

工控机是com 口3 支持232 485

连接两根线和继电器连接上

在工控机上写控制程序RTU模式 :

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"modbus.h"
#include <unistd.h>
 
int main(void)
{
  modbus_t *mb;
  uint8_t tab_reg[16];
  memset(tab_reg, 0, 16);

  mb = modbus_new_rtu("/dev/ttyS4",115200,'N',8,1);//open port
  modbus_rtu_set_serial_mode(mb, MODBUS_RTU_RS485);
  if (mb == NULL) {
    fprintf(stderr, "Unable to create the libmodbus context\n");
    return -1;
  }
  modbus_set_slave(mb,1);//set slave address
  int n=modbus_rtu_set_serial_mode(mb, MODBUS_RTU_RS485);
  printf("modbus_rtu_set_serial_mode = %d\n",n);


  int k =  modbus_connect(mb);
  printf("modbus_connect = %d\n",k);
  if(mb && modbus_connect(mb) == -1) {
  printf("\nSorry,fail to connect ttyUSB0,please check your device's state.\n");
  }
 
  k= modbus_rtu_get_serial_mode(mb);
  printf("modbus_rtu_get_serial_mode = %d\n",k);



  modbus_set_slave(mb, 1);
    
  uint8_t dest[4]; //setup memory for data
  uint16_t dest1[4] ={0};
  memset(dest, 0, 4);
  int i=0;
  int ret =0;


 
  if(mb == NULL)
{
   printf("No connection,check your device!\n");
   return -1;
}

 if(dest[1]==1)
 {
   
   for(i = 0; i < 4 ; i++)
   {
     ret = modbus_write_bit(mb, i ,0);

     if(ret==1)
     {
        printf("成功写入数据!返回值:%d\n",ret);
     }
    else
    {
        printf("写入数据失败,返回值:%d\n",ret);
    }
    sleep(2);
   }


 }

else
{
  for( i = 0; i < 4 ; i++)
  {
     ret = modbus_write_bit(mb, i ,0xff);

     if(ret==1)
     {
    printf("成功写入数据!返回值:%d\n",ret);
     }
    else
    {
        printf("写入数据失败,返回值:%d\n",ret);
    }
    sleep(1);
 }

}

  int j=0;
  modbus_read_bits(mb, 0, 4, dest);
 
  int regs = modbus_read_registers(mb,0,4,dest1);
  for(j = 0; j < 4 ; j++)
  {
    printf("\nmodbus_read_registers dest1[%d]=%4d,%4d\n",j,dest1[j],regs);
  }
 
  for(j = 0; j < 4 ; j++)
  {
    printf("\ndest[%d]=%4d\n",j,dest[j]);
  }
  modbus_close(mb);  
  modbus_free(mb);
  return 0;
}


modbus_rtu_set_serial_mode 没有设置成功 返回-1   modbus_rtu_get_serial_mode 返回为0 工控机com为232模式

我想把com口设置成485 模式 因为 连接的继电器是485口  如何解决  modbus_rtu_get_serial_mode 函数内容也看了 :

int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode)
{
    if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
#if HAVE_DECL_TIOCSRS485
        modbus_rtu_t *ctx_rtu = ctx->backend_data;
        struct serial_rs485 rs485conf;
        memset(&rs485conf, 0x0, sizeof(struct serial_rs485));

        if (mode == MODBUS_RTU_RS485) {
            rs485conf.flags = SER_RS485_ENABLED;
            if (ioctl(ctx->s, TIOCSRS485, &rs485conf) < 0) {
                return -1;
            }

            ctx_rtu->serial_mode |= MODBUS_RTU_RS485;
            return 0;
        } else if (mode == MODBUS_RTU_RS232) {
            if (ioctl(ctx->s, TIOCSRS485, &rs485conf) < 0) {
                return -1;
            }

            ctx_rtu->serial_mode = MODBUS_RTU_RS232;
            return 0;
        }
#else
        if (ctx->debug) {
            fprintf(stderr, "This function isn't supported on your platform\n");
        }
        errno = ENOTSUP;
        return -1;
#endif
    }

    /* Wrong backend and invalid mode specified */
    errno = EINVAL;
    return -1;
} 应该在ioctl 挂的  求如何解决


分享到: 关注收藏 邀请回答 回复 举报

sange 个人主页 给TA发消息 加TA为好友 发表于:2019-07-19 15:44:07 1楼
 

现场总线,工业以太网,工业交换机通信产品:(手机13072208083,网址www.tj-sange.com 天津)

(1)CAN CANOpen DeviceNet 总线

CAN转光纤(点对点)、CAN转光纤(环网 手拉手)

CAN集线器(8路)、CAN总线延长 中继器器、CANModbus 485. CAN转网口

(2)Modbus 485总线

485转光纤(点对点)、485转光纤(环网 手拉手)

485集线器(8路)、485总线延长 中继器器、CANModbus 485. 485转网口

(3)Profibus总线

Profibus转光纤(点对点)、Profibus转光纤(环网 手拉手)

Profibus集线器(4路)、Profibus总线延长 中继器器、ProfibusModbus 485

4)模拟量转光纤4-20mA 、模拟量转光纤0-10V、  开关量转光纤

5HARTModbus 485.

64-20mA 0-10V采集卡( 485接口Modbus协议)

7)手持信号发生器 电荷测量仪

8CC-LINK转光纤

9485 CAN PRIFIBUS  转网口

10485 4-20MA 0-10VLORA

(11) Profinet 转Modbus网关


  回复 引用 举报

周点击排行
周回复排行
最新求助
Advertisement