研华工控机通过CAN2.0B控制自己制作的PCB电路板

2023-10-27

      最近在做研华工控机控制输出IO,因为工控机的IO板卡比较贵,而且后面必须接继电器,这样会造成我们机器的电控柜比较大,电路走线非常困难,在这个原因的困扰下,我提出自己做一块IO驱动板的需求,最后在我们硬件工程师的努力下,总算完成IO驱动板的设计任务,并且他们写了板子的程序,同时他们也测试过稳定性及功能。

     因为要在工地测试我们机器,一直没有时间写CAN控制IO驱动的程序,最近在以前开发CANopen的基础上,编写CAN2.OB的通信程序。首先,我们有两个需求:(1)要能通过CAN分析仪进行控制IO输入输出。(2)能够通过研华CAN口控制IO输入输出。我们的工控机因为一开始设计程序的人用Window系统,人机界面是通过C#的Winform写的,同时跟硬件相关的制作成dll库进行调用,所以我们只能在已有的基础进行开发,通过读取研华工控机的说明书,他们的硬件支持can2.0b:

在了解到硬件支持扩展2.0b,接下来就是看看他们的数据接收和发送接口是否有,或者怎样知道发送是扩展帧还是标准帧,又查找他们的说明书,最后也发现,他们的里面有写:

 

确定了支持发送和接收API后,就是要跟PCB板进行通信,我们要看IO驱动板的协议是自己定的,所以我们贴出我们的协议(同事陈麟制定):

1.1 报文支持

本文介绍的协议,是基于CAN2.0B(29位ID的拓展格式帧)实现的高层协议。虽然CAN2.0B协议支持数据、远程、错误和溢出帧,但此高层协议只使用数据帧。

1.2 CAN2.0B报文格式

表1-1 CAN2.0B报文格式

CAN2.0B报文使用29位(bit)帧ID(11Bit SID + 18Bit EID),下文直接合并为29Bit ID域。DLC域指示数据段有多少个字节。本高层协议只使用了CAN2.0B的数据帧,所以该报文的其他域本文不再详细明。

1.3 高层协议报文格式

图1-1 高层协议说明

本协议的帧格式由6大部分组成:

  1. 优先权:控制该报文在CAN总线上的传输优先级,值越小,优先级越高;
  2. 功能码:指示该报文的功能;
  3. 目的地址:接收该报文的模块地址;
  4. 源地址:发送该报文的地址;
  5. 可选数据载荷:个别报文(功能码)会携带一些控制数据。

2.1 特别约定

从can通信特点来说,在can总线上的设备都有同等的通信地位。但在本协议约定的拓扑架构中,从通信地位上划分都有上位机和下位机之分,本协议只适用于具有上位机和下位机的拓扑架构模型,其模型图如下:

图2-1 设备拓扑

2.2 设备地址约定

本协议使用8位地址,最大支持256个设备。为了统一管理,对地址作以下约定:

表2-1 地址使用范围

地址区间

使用方式描述

255

广播地址

254

主机地址

0~253

从机地址

 

2.3 重启从机

表2-2 复位命令请求(主机发、从机收)

功能码

0x01

源地址

254

目的地址

0xFF(全部设备),其他(指定的设备地址),254无效

数据域

 

2.4 读取输入IO电平

表2-2 读取输入IO电平命令请求(主机发、从机收)

功能码

0x02

源地址

254

目的地址

0xFF(全部设备),其他(指定的设备地址),254无效

数据域

 

 

表2-3 读取输入IO电平明令回应(从机发、主机收)

功能码

0x03

源地址

从机地址

目的地址

254

数据域

2个字节,Bit0 ~ Bit15分别对应一个通道的电平,如Bit0的值为1代表通道0为高电平,值为0代表通道0为低电平。

 

2.5 设置输出IO电平

表2-4 设置输出IO电平命令(主机发、从机收)

功能码

0x04

源地址

254

目的地址

0xFF(全部设备),其他(指定的设备地址),254无效

数据域

Byte0~Byte1为控制值,Byte2~Byte3为通道掩码,详细见下文

 

数据域又细分为两个域:

  1. 控制值,16位,每一位分别指示每一个输出IO的电平,值为1代表高电平,值为0代表低电平。
  2. 通道掩码,16位。每一位分别对应一个IO通道,该位值位1代表控制值对应位的值有效,值为0代表控制器对应位的值无效。

举例,要设置通道0和通道3为高电平:

控制值为:0x0009(00000000 00001001),除了位0和位3,其他位的值随意

通道掩码为:0x0009(00000000 00001001)。

 

 

2.6 读取输出IO电平

表2-5 读取输出IO电平命令请求(主机发、从机收)

功能码

0x05

源地址

254

目的地址

0xFF(全部设备),其他(指定的设备地址),254无效

数据域

 

 

表2-6 读取输出IO电平命令回应(从机发、主机收)

功能码

0x06

源地址

从机地址

目的地址

254

数据域

2个字节,Bit0 ~ Bit15分别对应一个通道的电平,如Bit0的值为1代表通道0为高电平,值为0代表通道0为低电平。

 

2.7 设置电机状态

表2-7 设置电机正/反转命令(主机发、从机收)

功能码

0x07

源地址

254

目的地址

0xFF(全部设备),其他(指定的设备地址),254无效

数据域

Byte0~Byte1为控制值,Byte2为通道掩码,详细见下文

 

    1)控制值

表2-8 控制值说明(功能码0x07)

[0 : 1]

通道0控制值:0,待机,输出都为高阻;1,反转;2,正转;3,停止,输出都为低电平。

[2 : 3]

通道1控制值,同上

[4 : 5]

通道2控制值,同上

[6 : 7]

通道3控制值,同上

[8 : 9]

通道4控制值,同上

[10 : 11]

通道5控制值,同上

[12 : 13]

通道6控制值,同上

[14 : 15]

通道7控制值,同上

 

  1. 通道掩码

共8位(1Byte),每一位的值代表控制值里对应的通道控制值是否有效:1有效,0无效。

举例,控制电机0反转,电机3正转:

  1. 控制值:0x0042 (01 00 00 10), 除了[0:1]和[6:7],其他位的值随意。
  2. 通道掩码:0x09 (0000 1001), 位0和位3为1,其余为0。

2.8 读取电机状态

表2-9 读取电机状态命令请求(主机发、从机收)

功能码

0x08

源地址

254

目的地址

0xFF(全部设备),其他(指定的设备地址),254无效

数据域

 

 

表2-10 读取电机状态命令回应(从机发、主机收)

功能码

0x09

源地址

从机地址

目的地址

254

数据域

2个字节,解析请参考表2-8

 

2.9 自动上报输入IO状态

如果输入IO的电平有变动,从机会主动将以下报文发送到主机,主动上报IO的电平。

表2-11 输入IO电平变动通知报文(从机发、主机收)

功能码

0x0A

源地址

从机地址

目的地址

254

数据域

Byte0~Byte1为通道值,Byte2~Byte3为通道掩码,详细见下文

 

  1. 通道值:16位,每一位分别指示对应通道的电平值:1为高电平,0为低电平。
  2. 通道掩码:16位,每一位的值指示对应通道的电平是否发生变动:1,为发生变动, 0无变动。

最终调试结果就是我们通过上位机,可以控制我们工控机进行输入输出控制和读取数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

研华工控机通过CAN2.0B控制自己制作的PCB电路板 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐