例如:伺服驱动器,电视机,洗衣机,手机等硬件都需要设置参数后,才能正常使用。
作用:比如电视机背光亮度太高,晚上看电视刺眼睛,我们需要按自己的喜好调节。EDS文件是出厂值的参数表。 又比如变频器恢复出厂设置。
该文件实际是C#的ini文件格式保存的,可以用C#的ini读取方法加载到项目中
实际就是出厂默认参数,表。
由于硬件生产商不同(品牌)或硬件不同,同样的寄存器表,定义也不同,所以需要一个通用的参数表来告诉用户,参数的功能。
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 有限自动状态机
以下为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是广播帧:
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指所有从站
看 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预操作---------
跟串口一样,n长度的空闲电平。(CAN保持7bit长度的隐性电平)
出现1bit长度显性电平(表示数据帧开始,SOF)
ID(11bit,默认表示0~0x7FF从站)(实际是分割使用,比如4bit功能码 + 7bit从站地址)
DLC(表示后面有效字节长度)
Date64(表示64bit,也就是8字节)
CRC15(15bit校验值,用户用不到的,不用去了解)
EOF7(保持最少7bit长度隐性电平,此帧结束)
广播帧:
主站生产,从站消费
主站修改从站数据后,主站再发 帧id=0x80,使从站数据生效(从站动作)
尤其是PDO操作后,需要此帧。
COB-ID(11bit)
0x80 // 从站收到COB-ID是0x80的帧,驱动器开始生效修改的值(驱动器开始动作)
(1005h)同步对象 //同步对象 COB-ID 的次高位决定是否激活同步发生器。 0T00 0000000
(1006h)同步循环周期
相当于主站的心跳信号,从站伺服收到这个心跳后,大家按节拍一起动作。
回帧 06
281 381 481
0002
广播帧:
11bit值固定为 0x100
手册上也没讲解,应该是某个设备周期性的发送 ( 帧id=0x100 ) 的数据帧。
使所有从站根据这个心跳,按节拍动作。
从站生产,主站消费。 ( 主←从 ) //相当于从站喊救命
运行过程中,从站伺服报警了,该从站会发出这个数据帧,
主站监听到这个数据帧后再处理(是否停下整个机器)
错误寄存器 (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作用:跟电脑的快捷键一样(需要先配置,后使用)//只需配置一次
可以理解为万能遥控器。
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和PDO的区别:
PDO是点套餐。(一次操作几个寄存器)
SDO是单个点食物。(一次只能一个寄存器)
所以PDO效率高。
SDO用于读写单个寄存器。(配置参数等)