BeckHoff <---> Keyence (LJ-X8000) 2D相机 Profinet 通讯
目录
编辑
一、 设备介绍
1、产品特点
2、控制器选择
3、应用领域
二、PLC通讯接口配置
1、PLC添加GSDML文件
2、定义输入3、变量实例化
3、定义输出变量实例化
三、设备通讯接口数据类型定义
1、定义全局结构体数据
2、定义 INput Decode结构体数据
四、通讯功能块变量声明
五、通讯功能块程序
六、通讯功能块程序分析
6.1 代码功能分析
6.2整体架构解析
6.3 详细功能说明
初始化与全局变量
工作模式与命令请求处理
状态机主逻辑(CASE 结构)
错误处理与诊断
6.4 关键数据结构与接口
6.5 总结
七、通讯功能块功能描述及可能的改进空间
7.1 功能块描述
7.2 改进空间
八、附录
1、recive_data 子程序
2、send_data 子程序
一、 设备介绍
以下是基恩士 LJ-X8000 系列中的 2D 产品介绍:
1、产品特点
- 高精度测量:采用 3200points/profile 超高精度测量,能够极其精确地绘制目标物形状,实现精确的尺寸测量和外观检测,测量精度可达以往产品的 4 倍1。
- 高速采样:2D 模式下,采样周期最高可达 1kHz(1ms),可快速获取测量数据,满足在线检测等高速测量需求3。
- 易于设定:只需三步即可完成测量、检测所需的设定,操作轻松简单,兼顾了高精度和易操作性2。
- 丰富的工具与功能:每个设定有 100 个工具,其中 20 个为错位修正用,可通过识别工件的错位及倾斜,并自动修正,实现不受定位影响的在线全检3。
- 多种数据接口:具备 RS-232C、PLC 链接、USB、EtherNet/IP™、PROFINET、EtherCAT® 等丰富的接口,可方便地与其他设备进行连接和数据传输,实现系统集成和自动化控制3。
- 稳定可靠:采用圆柱形透镜防止反射光散射,配备大孔径接收器透镜增加接收光强度,新开发的 CMOS 在不同反射率的目标上也能提供更好的成像能力,确保测量的稳定性和可靠性2。
2、控制器选择
- LJ-X8000:适用于追求简单快速地实现在线检测场合,可连接最多 2 台感测头,支持 LJ-X8000 系列感测头、LJ-V7000 系列感测头。
- LJ-X8000E:提供用户高自由度编程的环境以及自行开发的选择,是追求以专有程序实现难度高、应用复杂检测的理想选择。
3、应用领域
- 电子制造:可对精密电子元件进行细微检测,如芯片封装、印刷电路板(PCB)的尺寸测量、焊点检测、元器件高度检测等,保证电子元件的质量和性能。
- 汽车制造:用于汽车零部件的尺寸控制、形状检测、装配精度检测等,如汽车发动机缸体、缸盖、曲轴、轮毂等零部件的测量和检测,确保零部件的质量和装配精度。
- 机械加工:用于机械加工零件的尺寸精度测量、形位公差检测、表面粗糙度测量等,帮助机械加工企业提高产品质量和加工精度。
- 其他领域:还可应用于建筑材料的均匀性检查、电缆的凹凸检测、端子的间距和高度差检测等多个领域
二、PLC通讯接口配置
1、PLC添加GSDML文件
2、定义2D相机的全局变量
2、定义输入3、变量实例化
3、定义输出变量实例化
三、设备通讯接口数据类型定义
1、定义全局结构体数据
2、定义 INput Decode结构体数据
TYPE ST_Laser_Profiler_Input_Decode : //Result_Data_128Byte + 32 x 5 Byte = 288 Bytes
STRUCT
ErrorCode :INT; // Status INT12
Reserved14 :INT; // Status INT14
Total_Count :DINT; // Status DINT16
CommandResult :DINT; // Status DINT20
CommandData :ARRAY [1..29] OF DINT; // Vision Check Command Datas DINT 20 - DINT136 (相机命令应答自己设置为 116 ) == Result_Data_128Byte
arrResult_Data :ARRAY [1..8] OF DINT; // Vision Check Result Datas DINT 140 - DINT168 == Result_Data_32Byte1 END_STRUCT
END_TYPE
(*
DINT140 = Result Data1
......
......
......
......
DINT168 = Result Data8
*)
3、定义OUTPUT Decode结构体数据
TYPE ST_Laser_Profiler_Output_Decode : //Parameter_128Byte
STRUCT
ExecCondNo :DINT; // Control DINT12
CommandNumber :DINT; // Control DINT16
CmdParameter :ARRAY [1..30] OF DINT; // Control Parameter DINT20 - DINT 136
END_STRUCT
END_TYPE
(*
DINT20 = CmdParameter1
......
......
......
......
DINT136 = CmdParameter30*)
四、通讯功能块变量声明
FUNCTION_BLOCK FB_TYP_162_Laser_Profiler_LJ_X_V1_0_1(*---------------------------------------------*)
(*IN variables*)
(*---------------------------------------------*)
VAR_INPUTiIn_idxElement : INT; (* !!!UNIQUE!!! Element identification*)ist_HWIn : ST_Laser_Profiler_Input; (* Profinet-interface: Inputs *)ibExt_CMD :BOOL;ibImage_StorageEnable :BOOL; // 照片存储使能 istPart_ID : STRING(30); (* Part Barcode *) // Carmera Software Need Config Command Parmeters Length
END_VAR(*---------------------------------------------*)
(*IN/OUT variables*)
(*---------------------------------------------*)
VAR_IN_OUTstINOUT_SYS_CELL :ST_SYS_CELL;
END_VAR(*---------------------------------------------*)
(*OUT variables*)
(*---------------------------------------------*)
VAR_OUTPUTost_HWOut : ST_Laser_Profiler_Output; (* Profinet-interface: Outputs *)oCurrent_Prog_No : INT; oCurrent_Exe_No : INT; oCmd_Idle : BOOL;
END_VAR(*---------------------------------------------*)
(*Local variables*)
(*---------------------------------------------*)
VARstLaser_Profiler_Data_Decode :ST_Laser_Profiler_Decode; (* Laser Profiler Interface Datas *)Dly_Ton : TON;Dly_Ton1 : TON; Dly_Ton2 : TON; Execution_Timeout : TON; Step :INT;Checked_Count :DINT; Start_Condition :BOOL;Cmd_No :INT; // 24 =Switch Program Numer,25=Read Prog No,41=Entry Execute No,42=Read Current Execute No,60=Entry String,61=Read String Cmd_Type :BYTE; // (*0= Switch Program Number,1=Switch Excution Condition Number,2=Trigger Check *) Count_No :INT;index :INT:=0;index1 :INT:=0;strTemp :T_MAXSTRING; Data_Barcode :T_MAXSTRING; arrData :ARRAY [0..255]OF BYTE;UnpackDWord :MEM.UnpackDWord;
END_VAR(*---------------------------------------------*)
(*Local temp variables*)
(*---------------------------------------------*)
VARstTemp_CELL : ST_SYS_CELL; (* Cell structure for element*)stTemp_ELEMENT : ST_SYS_ELEMENTS; (* Data structure of element *)tTemp_T_Ticker :TIME;(* actual CPU-Tick *)bVar_REQ_HP : BOOL; // Execute FunctionbVar_REQ_WP_1 : BOOL; // Load Job NumberbVar_REQ_WP : BOOL; // Cision Check StartwTemp_Diagnose : WORD;(*Error MessagesBIT.0 Robot: Collective ErrorBIT.1 Robot: Task number invalidBIT.2 Robot: Missing release for task start BIT.3 Robot: Emergengy Stop from robot BIT.4 Robot: Error - Bus StateBIT.5 Robot: Error - Program not startedBIT.6 Robot: Error - Stop by programBIT.7 Robot: Error - Stopped by userBIT.8 Robot: ReserveBIT.9 Robot: Teach Mode activeBIT.10 Robot: resBIT.11 Robot: resBIT.12 Robot: No Connection to Robot TCP_IP-ServerBIT.13 Robot: No answer from robot for Read errorBIT.14 Robot: User Error by RobotBIT.15 Robot: Reserve*)
END_VARVAR idxRotaryCylinder :UINT := 0; (* Element Connection to 'Cylinder V021 ' - set to "0" if not used *)idxLaser_Profiler :UINT := 0; (* Element Connection to 'Camera 3D lJ-X8000 ' - set to "0" if not used *)idxVision_AxisX :UINT := 0; (* Element Connection to 'Axis X ' - set to "0" if not used *)idxVision_AxisY :UINT := 0; (* Element Connection to 'Axis Y ' - set to "0" if not used *) Step_Fun_Master : UINT; MeasureDatas_3D : ARRAY [1..9] OF ST_Laser_Profiler_Result; bMeasterExecuteEnd : BOOL; // 执行完成bMeasureExecuteEnd : BOOL; // 执行完成 CylPos_Define : ARRAY [1..9] OF USINT; Index_AxisPos : USINT; MeasureNo : USINT; // 测量次数 Step_Fun_Measure : UINT;
END_VAR
五、通讯功能块程序
(* Initialisation of FB internal structures - for reducing length of expressions *)
acstartCopyData();(*=============&#