CANopen协议,上位机开发(C#)

CANopen协议,上位机开发(C#)_第1张图片

文件作用:支持CANopen协议的硬件设备的:参数表

例如:伺服驱动器,电视机,洗衣机,手机等硬件都需要设置参数后,才能正常使用。

作用:比如电视机背光亮度太高,晚上看电视刺眼睛,我们需要按自己的喜好调节。EDS文件是出厂值的参数表。 又比如变频器恢复出厂设置。

前世:

该文件实际是C#的ini文件格式保存的,可以用C#的ini读取方法加载到项目中

实际就是出厂默认参数,表。

(今生)需求: 

由于硬件生产商不同(品牌)或硬件不同,同样的寄存器表,定义也不同,所以需要一个通用的参数表来告诉用户,参数的功能。

参数表从   0x0000 到  0xFFFF    (16bit寄存器)

65536个,很显然硬件参数用不完这些寄存器。所以把参数表分割成几大块。大家按区域使用。

指数(十六进制)    目标

0000             未使用

0001-025F        数据类型

0260-0FFF        保留供进一步使用

1000-1FFF        》通信参数 区域 CiA301(DS301)

2000-5FFF        》硬件参数 区域(生产制造商特定)

6000-9FFF        》标准化,运动控制 区域 CiA402(DSP402)

A000-AFFF        网络可变区域

B000-BFFF        系统可变区

C000-CFFF        保留供进一步使用

 必须注意的是 2000h编号段的寄存器,由硬件厂商定义参数功能(变频器伺服,第一个参数定义是不同的。)

其他号段的参数基本是通用的。(如6000h号段,寄存器的功能就是CiA402的定义,只要伺服支持这个协议,那所有品牌的伺服,这个寄存器段定义都一样。)

1000h段的寄存器,是硬件通讯的定义CiA301。只需要大概了解。(CANopen最大1MHz)

1400h寄存器和1600h寄存器:
作用:绑定 PDO功能码

流程:1400先关闭 PDO功能,然后 1600绑定好寄存器,最后再开启1400的PDO功能。

如果要组双 X轴大梁 的雕刻机。
1400的通讯配置,2个伺服要一样。

1400-00表示本寄存器子索引数量(5)
1400-01 通讯功能
         bit31:0开启PDO   (1<<31关闭PDO)
         bit28:0表示11bit的cob_id  (1表示 29bit的cob_id)
         bit27~0:表示 PDO1的功能码  0x200+本站地址
            (注: 1400-01= 0x 4000 0201)// 用29位cobid, PDO1功能码0x201 从站1
1400-02 动作延迟
         收到同步帧后,伺服延迟us动作(0x00~0xF0)
            0xFE为SDO动作
            0xFF为事件动作,事件驱动(设备配置文件和应用程序特定)
1400-03  rPDO1输入命令过滤单位0.1ms(跟开关输入滤波一样)
                  雷赛是40ms
1400-04  通讯故障回帧值
                    0x06090011 子索引不存在
                  

 6000h段的寄存器,功能基本是通用的。比如6040h和6041h

所谓 CiA402协议,指的就是 0x6000~0x9FFF寄存器的定义。
要支持CiA402,那寄存器的功能定义就必须相同。

1010h-01 是通讯参数保存,子索引0(功能是表示子索引总数量。)这部分的子索引数量可能会有些区别。
      1010h-01=0x65766173;//保存所有设置参数(寄存器0x1010,子索引0x01)

    //使能电机
            set_region(0x6040, 0, 0x06);// 准备好启动
            set_region(0x6040, 0, 0x07);// 启动
            set_region(0x6040, 0, 0x0F);// 操作生效

            set_region(0x6060, 0, 0x01); //设置为轮廓位置模式  ( 1位置 3速度 6回零 )
            set_region(0x6081, 0, 40000); // 最大速度 40k( 400转 0x9c40)
            set_region(0x6082, 0, 1000); // 启停速度// ?
            set_region(0x6083, 0, 80000); //800转 加速度 80k(0x13880)
            set_region(0x6084, 0, 80000); // 减速度 100k

            PDO1r_Config(0x6040, 16, 0x607A, 32);//目标位置
            PDO1t_Config(0x6041, 16, 0x6064, 32);//位置反馈

/// 
        /// 移动控制6040h,607A
        /// 
        /// 
        public void PDO1(int reg1, int bits, int reg2)// 6040  607A 目标位置
        {// PDO1操作  200h+
            //  6040  607a
            //  16     32 
            // 1122-33445566-7788 (数据帧:低字节先出)
            // a<<6字节
            // b<<2字节
            Int64 a = reg1;
            Int64 b = reg2;
            Int64 byte8;

            if (reg1 == 0x10F)//停止运行
            {
                b = b << bits;
                byte8 = a + b;// 6040绑定在(数据帧低字节)
                can.send(0x08, 0x200 + address, byte8);
                SYNC();// 同步信号
                return;
            }

            a &= 0xEF;
            b = b << bits;

            byte8 = a + b;// 6040绑定在(数据帧低字节)

            can.send(0x08, 0x200 + address, byte8);
            SYNC();// 同步信号
            Help_Delay.delayTime(0.040);// 0.04秒


            a |= 0x1F;// 上升沿
            byte8 = a + b;// 6040绑定在(数据帧低字节)

            can.send(0x08, 0x200 + address, byte8);
            SYNC();// 同步信号

        }

名称定义:

CAN    控制局域网
CiA    CAN自动化组织 (标准机构)
COB-ID 通讯对象标识符 (CAN的仲裁段 帧id: 11bit位置)
EDS    电子数据表
NMT    网络管理(管理所有从站)
OD     对象字典
PDS    电源驱动系统(6040h 的 bit7 和 bit3~0)
PDO    过程数据对象
RPDO   接收过程数据对象
SDO    服务数据对象
TPDO   发送过程数据对象
COS    TPDO检测状态改变
FSA    有限自动状态机

 COB_ID定义(4bit功能码 + 7bit从站地址)

以下为CAN帧   11bit 的定义(4bit功能码 + 7bit从站地址)

这个属于CAN标准数据帧 id(11bit)的位置,厂家把11bit分割成(4bit+7bit来用)
4bit表示功能码
7bit表示从站地址

COB      功能码      COB-ID值
NMT      0000b    0 (000h)//主站生产,网络管理(B0,B1)  主→从
SYNC     0001b  128 (080h)//主站生产,节拍帧(主站发心跳信号  帧id=0x80,byte8不用)
TIME     0010b  256 (100h)//主站生产,时间同步(主站生产,帧id=0x100 )

//从站故障报文 80h+从站地址
EMCY从站故障  0001b  129 (081h) –  255 (0FFh)// 主←从(0x80+从站地址)从站急停报文

PDO1(TX) 0011b  385 (181h) –  511 (1FFh)// 主←从(从站生产,主站消费)高速读写寄存器
PDO1(RX) 0100b  513 (201h) –  639 (27Fh)// 主→从(200h+从站地址,再byte8)

PDO2(TX) 0101b  641 (281h) –  767 (2FFh)
PDO2(RX) 0110b  769 (301h) –  895 (37Fh)
PDO3(TX) 0111b  897 (381h) – 1023 (3FFh)
PDO3(RX) 1000b 1025 (401h) – 1151 (47Fh)
PDO4(TX) 1001b 1153 (481h) – 1279 (4FFh)
PDO4(RX) 1010b 1281 (501h) – 1407 (57Fh)

SDO(TX)  1011b 1409 (581h) – 1535 (5FFh)// 主←从( 580h+从站地址)低速读写寄存器
SDO(RX)  1100b 1537 (601h) – 1663 (67Fh)// 主→从( 600h+从站地址)  

NMT从站状态 1110b 1793 (701h) – 1919 (77Fh)//主←从(0x700+从站地址)(B0)从站网络状态

 NMT定义:全局网络管理(主→从)  帧id=0x00

NMT是广播帧:
11bit的值,固定为  0x00 ( 全0 )
DLC限制为2字节
Byte0:功能码
Byte1:从站地址

就是说11bit的值,只有一个,不再分割使用(是个整体),并且只有主站才使用这个数据帧。(帧id=0x00)
8字节内,只使用2字节

byte0:01h 从站启动(回帧05h运行模式)
       02h 从站停止(回帧04h停止模式)
       80h 从站预运行(使能状态)(回帧7Fh预运行模式)PDO方法失效
       81h 从站重启(一般从站伺服报警后才用,或重启才能生效的参数)(回帧7Fh预运行模式)
       82h 从站通讯重连(回帧 7Fh预运行模式)

byte1:1~7Fh  被命令的从站编号(1~127 站) 0x00指所有从站

CANopen协议,上位机开发(C#)_第2张图片

看 NMT网络管理之前,先要了解下CAN的标准数据帧
CAN标准数据帧: 单帧( 11bit + 64bit )
DLC:限制64bit有效长度(有效字节长度)
11bit是COB-ID (4bit功能码 + 7bit从站地址)//不能全0
64bit是8byte  (有效字节由功能码控制,DLC决定)

11bit的值为全0时,从COB-ID模式切换成NMT模式
进入NMT全网管理模式,DLC限制为2
11bit(000 0000 0000b)//表示CAN总线上所有设备。
控制DLC  2字节有效(Byte0 NMT指令 + Byte1 从站地址)

雷赛从站回帧:网络状态(0x700+从站地址)
0从站心跳-----------
1未连接
2连接
3预备
4停止模式----------
5运行模式----------
0x7F预操作---------

CANopen协议,上位机开发(C#)_第3张图片

跟串口一样,n长度的空闲电平。(CAN保持7bit长度的隐性电平)

出现1bit长度显性电平(表示数据帧开始,SOF)

ID(11bit,默认表示0~0x7FF从站)(实际是分割使用,比如4bit功能码 + 7bit从站地址)

DLC(表示后面有效字节长度)

Date64(表示64bit,也就是8字节)

CRC15(15bit校验值,用户用不到的,不用去了解)

EOF7(保持最少7bit长度隐性电平,此帧结束)

SYNC定义: 同步节拍帧(主→从)     帧id=0x80

广播帧:
主站生产,从站消费
主站修改从站数据后,主站再发 帧id=0x80,使从站数据生效(从站动作)
尤其是PDO操作后,需要此帧。


COB-ID(11bit)
        0x80    // 从站收到COB-ID是0x80的帧,驱动器开始生效修改的值(驱动器开始动作)

(1005h)同步对象    //同步对象 COB-ID 的次高位决定是否激活同步发生器。 0T00 0000000
(1006h)同步循环周期


相当于主站的心跳信号,从站伺服收到这个心跳后,大家按节拍一起动作。

回帧 06
281  381  481
0002

TIME定义:同步时间(主→从)    帧id=0x100

广播帧:
   11bit值固定为  0x100

手册上也没讲解,应该是某个设备周期性的发送 ( 帧id=0x100 )  的数据帧。
使所有从站根据这个心跳,按节拍动作。

EMCY定义:急停报文(主←从)  帧id=( 0x80+从站地址)

从站故障,xx从站故障后发出该报文(再由主站去处理业务)

从站生产,主站消费。  ( 主←从 ) //相当于从站喊救命

运行过程中,从站伺服报警了,该从站会发出这个数据帧,
主站监听到这个数据帧后再处理(是否停下整个机器)

错误寄存器  (1001h) 反映该节点的一般错误状态 ,各个位按相应的错误分类
预定于错误场(1003h) 保存最近出现的错误

COB-ID            Byte 0:1        Byte 2              Byte 3:7
0x080+Node-ID     应急错误代码     错误寄存器(1001H)    厂商指定区域

byte0~1:
        应急错误代码
        0000H 无错误
        8110H CAN 溢出
        8120H 错误被动模式(0411)
        8130H 寿命保护/心跳错误
        8140H 被迫离线恢复故障
        8141H 被迫离线
        8150H 发送 COB-ID 冲突
        8210H PDO 长度错误未处理
        8220H PDO 超过长度

byte2:
        (1001H)位定义
        Bit0:generic error 一般错误
        Bit1:current 电流
        Bit2:voltage 电压 (04)
        Bit3:temperature 温度

byte3~7:
        Bit4:communication error (overrun,error state) 通讯错误
        Bit5:device profile specific 设备
        Bit6:Reserved (always 0) 保留
        Bit7:manufacturer specific 厂家

PDO定义:高速读写寄存器  (运动控制用

CANopen协议,上位机开发(C#)_第4张图片

PDO作用:跟电脑的快捷键一样(需要先配置,后使用)//只需配置一次
可以理解为万能遥控器。

1把几个寄存器的地址映射到这个PDOx寄存器上。
2下次使用PDO读写,就是读写映射的寄存器。

高速读写寄存器        COB-ID值
PDO1(TX) 0011b      (181h) –   (1FFh)// (主←从)
PDO1(RX) 0100b      (201h) –   (27Fh)// (主→从)帧id = 0x200+从站地址

PDO2(TX) 0101b      (281h) –   (2FFh)
PDO2(RX) 0110b      (301h) –   (37Fh)// (主→从)帧id = 0x300+从站地址
PDO3(TX) 0111b      (381h) –   (3FFh)
PDO3(RX) 1000b      (401h) –   (47Fh)
PDO4(TX) 1001b      (481h) –   (4FFh)
PDO4(RX) 1010b      (501h) –   (57Fh)
PDO是需要先映射寄存器后,才能对映射的寄存器读写。(PDO相当于快捷键)
去洗脚城点8号技师,(8号技师,可以是老板娘,也可以是小姨子,看寄存器怎么绑定)

                  参数开关               地址绑定
rPDO1(主→从)      1400h                 1600h
rPDO2              1401h                 1601h
rPDO3              1402h                 1602h
rPDO4              1403h                 1603h

注:1400-01先关(1<<31),等1600配置好后,1400-01再开启

    1400有2个子索引:01:bit31(0开,1关rPDO)bit28(0:11bit,1:29bit扩展帧)
                    02:SYNC(80h帧)节拍后,响应延迟us(0~0xF0)0xFE事件驱动(制造商特定)
                                              0xFF事件驱动(设备配置文件和应用程序特定)

    1600有8个子索引:00:绑定的有效个数(64bit分割,寄存器个数)
                    01:绑定指针1(一般绑 0x6040寄存器)
                        bit31~16寄存器编号
                        bit15~8 子索引
                        bit7~0  有效bit(8h,10h,20h)8位,16位,32位

                    02:绑定指针2
                    03:绑定指针3
                    04:绑定指针4
                    05:绑定指针5
                    06:绑定指针6
                    07:绑定指针7
                    08:绑定指针8


                  参数开关               地址绑定
tPDO1(主←从)      1800h                 1A00h
tPDO2              1801h                 1A01h
tPDO3              1802h                 1A02h
tPDO4              1803h                 1A03h
注:
    1800有6个子索引:00:子索引长度(表示1800有多少个子索引)先关,绑好后再开
                    01:bit31(0开,1关tPDO)
                        bit30(0rtr开,1关)
                        bit29~11()
                        bit10~0()
                    02:SYNC节拍后,延迟us(0~0xFF)
                    03:帧间隔0.1ms(400是40ms)
                    04:
                    05:事件时间ms
                    06:SYNC信息计数器等于该值将会作为第一个接收到的SYNC消息处理。

    1A00有8个子索引:00:绑定的有效个数(64bit中寄存器占个数)
                    01:绑定指针1(一般绑 0x6041寄存器)
                        bit31~16寄存器编号
                        bit15~8 子索引
                        bit7~0  有效bit(8h,10h,20h)8位,16位,32位

                    02:绑定指针2
                    03:绑定指针3
                    04:绑定指针4
                    05:绑定指针5
                    06:绑定指针6
                    07:绑定指针7
                    08:绑定指针8

例子:寄存器0x1600子索引01赋值0x60400010;

先设置 1400h-01=1<<31;// 关闭rPDO
1600h-01h = 0x6040 00 10;//0x60400010;绑定寄存器0x6040
RPDO1指针,指向寄存器0x6040,00子索引,10(16bit)
再设置 1400h-01=0<<31;// 打开rPDO

08(8bit)
10(16bit)// 例子中 10 指 寄存器0x6040是16bit的
20(32bit)// 0x20

例子2: 寄存器0x1A00子索引01赋值0x60410010;

0x1A00-01是伺服上传(TPDO1)
0x6041是把TPOD1和寄存器0x6041绑定
00是寄存器0x6041的子索引
10是寄存器的类型 16bit
作用:伺服上传 寄存器0x6041-00的数据

//========================
寄存器0x1400-01
bit31:  PDO1总开关(0开,1关)//进行设置的时候先关,再开。 1600也是如此(1600-00先设置0)
bit28:地址bit长度(0:11bit   1:29bit)

寄存器0x1400-02 //表示在下一个SYNC同步信号80h发生之后CANopen驱动器响应接收到的数据
0~0xF0 延时us   //雷赛用0x01us,0h立即,0xFE由SDO动作,0xFF事件立即响应
      public void PDO1r_Config(Int16 reg1,int bita, Int16 reg2 ,int bitb)// 1400,1600
        {
            Int32 reg;
            //1400-01:总开关
            //1600-00:绑定数量
            //1600-01:第一绑定寄存器    6040油门离合
            //1600-02:第二绑定寄存器    607A目标地址
            // 2个寄存器,6040h,607Ah
            // 0x6040   b7  b3b2b1b0

            //          b7  ↑故障复位
            //         0x06  关闭
            //         0x07  打开
            //         0x0F  打开+启用操作
            //         0<<1  快速停止
            //         0x07  禁用操作
            //         0x0F  启用操作
// 0x10F 停止运行

            set_region(0x1400, 0x01, 1 << 31);  // 关闭 PDO1 功能(原值: 0x40000201)
            set_region(0x1600, 0x00, 0x00);  //    关闭 PDO1 绑定功能 (原值:0x00000002)

            set_region(0x1400, 0x02, 1); // 同步的延迟1us(1~240us) (原值:0x000000FF)
            set_region(0x1400, 0x03, 1);//  rPDO1滤波 单位0.1ms  (原值:0x00000000)
            reg = reg1;
            reg <<= 16;
            reg += bita;
            set_region(0x1600, 0x01, reg );// 绑定6040   0x60400010     (原值:0x60400010)
            reg = reg2;
            reg <<= 16;
            reg += bitb;
            set_region(0x1600, 0x02, reg);// 绑定607A    32bit   0x607A0020    (原值:0x607A0020)

            set_region(0x1600, 0x00, 2); // 绑定的寄存器 生效       (原值:0x00000002)
            int pdo =(1<<30)+0x200+address;  // 要看手册 29bit帧的选项    , +   rPDO接收码 +  本站地址
            set_region(0x1400, 0x01, pdo);  // 开启PDO1       (原值:0x4000 0201)

        }

   public void PDO1(int reg1,int bits,int reg2)// 6040  607A 目标位置
        {// PDO1操作  200h+
            //  6040  607a
            //  16     32 
            // 1122-33445566-7788 (数据帧:低字节先出)
            // a ,2字节
            // b ,4字节
            Int64 a = reg1;
            Int64 b = reg2;
            Int64 byte8;

            if (reg1==0x10F)//停止运行
            {
                b = b << bits;
                byte8 = a + b;// 6040绑定在(数据帧低字节)
                can.send(0x08, 0x200 + address, byte8);
                SYNC();// 同步信号
                return;
            }

            a &= 0xEF;// 上升沿触发
            b =b<

SDO定义:速读写寄存器

用于设置单个寄存器的读写。

CANopen协议,上位机开发(C#)_第5张图片

SDO和PDO的区别:
PDO是点套餐。(一次操作几个寄存器)
SDO是单个点食物。(一次只能一个寄存器)
所以PDO效率高。

SDO用于读写单个寄存器。(配置参数等)

你可能感兴趣的:(现场总线,eds)