智能串口协议转换模块(双串口)SS-431

基本说明:连接百种串口协议设备到Modbus总线;整合多个Modbus协议的设备,使多个Modbus设备如同一个设备那样被访问;无需PLC、PC等主站设备,即可使Modbus从站设备互相交换数据;无需开发Modbus协议,即可使用简单的协议轻松连接Modbus设备;提供协议定制开发服务。

产品特点:
1、凡具有RS-232/RS-485接口的设备都可以使用本产品实现数据的交换和传递。如:具有RS-485接口的变频器、电机启动保护装置、智能高低压电器、电量测量装置、各种变送器、智能现场测量设备、仪表、PLC及PC等等;
2、配置软件SS-123可轻松完成SS-431的配置,不需要复杂编程,即可在短时间内实现连接通信;

技术特性:
1、SS-431具有两个串口,串口Ⅰ为RS-485标准,串口Ⅱ为RS-485 或RS-232标准(需在订货时指明);
2、SS-431支持的协议类型:Modbus主站、Modbus从站、自定义协议以及通用模式(接收式、问答式);
3、串口参数:
①工作方式:半双工;
②波特率:300、600、1200、2400、9600、19200、38400、57600、115200bps;
③数据位:8位;
④校验位:无、奇、偶、标志、空格可选;
⑤停止位:1、2位可选;
4、Modbus主站:
①支持的功能码:01H、02H、03H、04H、05H、06H、0FH、10H号功能;
②支持的格式:RTU格式和ASCII格式;
③具有的功能:写命令输出方式连续输出、禁止输出或逢变输出可选;
④每个主站最多可配置48条Modbus命令;
5、Modbus从站:
①支持的功能码:03H、04H、06H、10H号功能;
②支持的格式:RTU格式和ASCII格式;
6、通用模式:
①分为问答式和接收式两种通信方式;
②问答式可选配帧头、数据、常量、校验、帧尾等,配置灵活;
③接收式可缓存多帧数据,避免瞬时数据量大导致丢帧现象;
7、SS-431允许输入/输出字节数:
①Max Input Bytes ≤ 1KBytes;
②Max Output Bytes ≤ 1KBytes;
③Input Bytes + Output Bytes ≤ 2KBytes;
8、供电:24VDC (11V ~ 30V),功耗:<140mA (DC24V);
9、工作环境温度:-40℃ ~ 70℃;工作环境湿度:5% ~ 95%(无凝露);
10、内置静电防护:15 KV ESD;通信端口隔离:3KV;
11、机械尺寸:18mm (宽)x 100mm(高) x 115mm(深);
12、安装:35mm导轨;
13、防护等级:IP20;

图片:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一份简单的代码示例,你可以在此基础上进行修改和完善。 ``` #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdint.h> #include <time.h> // 串口初始化等操作省略 // 请根据实际情况进行设置 // 定义北斗模块发送的数据缓存大小 #define BUFFER_SIZE 128 // 定义数据解析结果缓存大小 #define RESULT_SIZE 32 // 定义GNRMC数据格式结构体 typedef struct { char utc_time[10]; // UTC时间,格式为hhmmss.ss char status; // 状态,A为有效,V为无效 double latitude; // 纬度,格式为ddmm.mmmm char latitude_dir; // 纬度方向,N为北纬,S为南纬 double longitude; // 经度,格式为dddmm.mmmm char longitude_dir; // 经度方向,E为东经,W为西经 float speed; // 速度,单位为节 float course; // 航向,单位为度 char date[10]; // 日期,格式为ddmmyy char mv; // 磁偏角方向,E为东,W为西 float mv_value; // 磁偏角,单位为度 char mv_var; // 磁偏角变化,D为减小,I为增加 char mode; // 模式指示,A为自主定位模式,D为差分GPS模式,E为估算模式 char checksum[4]; // 校验和 } GNRMC_Data; // 使用正则表达式提取数据并存储到结构体中 int parse_GNRMC(char *buffer, GNRMC_Data *data) { // 匹配$GNRMC,xxxxxxxxxxxx*hh char pattern[] = "\\$GNRMC,([0-9.]*),([AV]),([0-9.]*),([NS]),([0-9.]*),([EW]),([0-9.]*)" ",([0-9.]*)\\*([0-9A-F]{2}),([0-9]{6}),([0-9.]*)?([EW])?,?([0-9.]*)?" ",?([DI])?,([ADE])\\r\\n"; regex_t reg; regmatch_t pmatch[15]; int reti, i; // 编译正则表达式 reti = regcomp(&reg, pattern, REG_EXTENDED); if (reti) { fprintf(stderr, "Could not compile regex\n"); return -1; } // 匹配数据 reti = regexec(&reg, buffer, 15, pmatch, 0); if (!reti) { // 根据匹配结果提取数据 strncpy(data->utc_time, buffer + pmatch[1].rm_so, 9); data->utc_time[9] = '\0'; data->status = buffer[pmatch[2].rm_so]; data->latitude = atof(strndup(buffer + pmatch[3].rm_so, pmatch[3].rm_eo - pmatch[3].rm_so)); data->latitude_dir = buffer[pmatch[4].rm_so]; data->longitude = atof(strndup(buffer + pmatch[5].rm_so, pmatch[5].rm_eo - pmatch[5].rm_so)); data->longitude_dir = buffer[pmatch[6].rm_so]; data->speed = atof(strndup(buffer + pmatch[7].rm_so, pmatch[7].rm_eo - pmatch[7].rm_so)); data->course = atof(strndup(buffer + pmatch[8].rm_so, pmatch[8].rm_eo - pmatch[8].rm_so)); strncpy(data->checksum, buffer + pmatch[9].rm_so, 4); data->checksum[4] = '\0'; strncpy(data->date, buffer + pmatch[10].rm_so, 6); data->date[6] = '\0'; if (pmatch[11].rm_so != -1) { data->mv = buffer[pmatch[11].rm_so]; data->mv_value = atof(strndup(buffer + pmatch[12].rm_so, pmatch[12].rm_eo - pmatch[12].rm_so)); if (pmatch[13].rm_so != -1) { data->mv_var = buffer[pmatch[13].rm_so]; } } data->mode = buffer[pmatch[14].rm_so]; } else if (reti == REG_NOMATCH) { fprintf(stderr, "No match\n"); return -1; } else { fprintf(stderr, "Regex match failed\n"); return -1; } // 释放正则表达式 regfree(&reg); return 0; } // 将UTC时间和日期转换为北京时间 void utc_to_beijing(char *utc_time, char *date, char *beijing_time, char *beijing_date) { struct tm t; time_t utc, beijing; int year, month, day, hour, minute, second; // 解析UTC时间和日期 sscanf(utc_time, "%02d%02d%02d", &hour, &minute, &second); sscanf(date, "%02d%02d%02d", &day, &month, &year); // 转换为struct tm结构体 t.tm_year = year + 100; // 1900年至今的年数,需要加100 t.tm_mon = month - 1; // 月份从0开始 t.tm_mday = day; t.tm_hour = hour; t.tm_min = minute; t.tm_sec = second; // 转换为UTC时间戳 utc = mktime(&t); // 转换为北京时间戳 beijing = utc + 8 * 3600; // 北京时间比UTC时间多8小时 // 格式化输出 strftime(beijing_time, 9, "%H%M%S", localtime(&beijing)); strftime(beijing_date, 7, "%d%m%y", localtime(&beijing)); } int main() { char buffer[BUFFER_SIZE]; GNRMC_Data data; char beijing_time[10], beijing_date[10]; int ret; while (1) { // 从串口接收数据 // 请根据实际情况进行操作 ret = receive_uart2(buffer, BUFFER_SIZE); if (ret < 0) { fprintf(stderr, "UART receive error\n"); continue; } // 解析GNRMC数据 ret = parse_GNRMC(buffer, &data); if (ret < 0) { fprintf(stderr, "GNRMC parse error\n"); continue; } // 将UTC时间和日期转换为北京时间 utc_to_beijing(data.utc_time, data.date, beijing_time, beijing_date); // 输出结果 printf("UTC Time: %s\n", data.utc_time); printf("Status: %c\n", data.status); printf("Latitude: %f %c\n", data.latitude, data.latitude_dir); printf("Longitude: %f %c\n", data.longitude, data.longitude_dir); printf("Speed: %f knots\n", data.speed); printf("Course: %f degrees\n", data.course); printf("Date: %s\n", data.date); printf("Magnetic Variation: %f degrees %c %c\n", data.mv_value, data.mv, data.mv_var); printf("Mode: %c\n", data.mode); printf("Beijing Time: %s\n", beijing_time); printf("Beijing Date: %s\n", beijing_date); } return 0; } ``` 注:以上代码仅供参考,可能存在错误和不足之处,请根据实际情况进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值