CANBus 应用示例库 - 结构化文本与CFC编程

下载需积分: 18 | PDF格式 | 127KB | 更新于2024-08-31 | 134 浏览量 | 8 下载量 举报
收藏
"CANBus_Example_en.pdf - 一个关于如何在Codesys V3环境中使用CANbus功能的库,包括对象导向编程的Structured Text和图形化编程的CFC语言示例,内部依赖于CANBus Low Level系统库。" 本文将详细阐述CANBus(Controller Area Network Bus)在Codesys V3中的应用,特别是CAA_CanL2.library库中的功能块和接口,以及如何通过提供的示例程序来实现CANBus通信。 1. CANBus基础知识 CANBus是一种串行通信协议,广泛应用于汽车、工业自动化和嵌入式系统中,因为它具有高可靠性和抗干扰能力。它支持两种帧格式:11位标识符(标准帧)和29位标识符(扩展帧)。 2. Codesys V3中的CANBus功能 Codesys是符合IEC 61131-3标准的编程环境,支持多种编程语言,包括Structured Text和Continuous Function Chart (CFC)。在CANBus_Example_en.pdf中,它提供了一个优化的库,使得用户可以方便地利用CANBus功能进行通信。 3. CAA_CanL2.library 这个库包含了实现CANBus通信所需的基本组件,如发送器、接收器和诊断工具。它依赖于CANBus Low Level系统库,这是一个低级别的接口,直接与硬件交互,处理CAN总线的物理层和数据链路层功能。 4. 接口IMessageProcessor 用户需要实现IMessageProcessor接口来处理接收到的所有CAN消息。`ProcessMessage`方法是关键,它负责解析和处理从CAN总线接收到的电文。 5. ICANDriver接口 ICANDriver接口定义了驱动程序应遵循的标准,如CANDriver_11bit和CANDriver_29bit类。CANSender、CANMaskReceiver、CANAreaReceiver和CANBusDiagnosis等组件需要一个实现了ICANDriver接口的实例来进行CAN总线操作。 6. 图形化POUs(Program Organization Units) 针对CFC等图形化编程语言优化的功能块包括: - CANSender:用于发送CAN消息。 - CANMaskReceiver:基于标识符掩码接收CAN消息,允许筛选特定的消息。 - CANAreaReceiver:根据预定义的地址范围接收消息。 - CANBusDiagnosis:提供总线诊断功能,检测CAN网络的状态。 7. 示例程序 库中包含两个示例程序,分别用Structured Text和CFC实现,以展示如何在实际项目中使用这些功能。这两个示例提供了从零开始实现CANBus通信的起点,帮助开发者快速理解和应用CANBus功能。 "CANBus_Example_en.pdf"是一个实用的资源,对于那些在Codesys V3环境中开发涉及CANBus通信的系统的人来说,它提供了宝贵的指导和支持。通过理解并应用这个库中的接口和示例,用户能够有效地实现CANBus通信,无论是进行对象导向的编程还是采用图形化的编程方式。

相关推荐

filetype

解释这段代码逻辑 void TPS929120_CorrespondDriverIndexFrmtypeSts(uint8 u8_bus_id_in,uint8 u8_frmtype) { uint8 u8_ValidDrvNum = 0; uint8 u8_RepeatRnblDrvNum = 0; u8_RepeatRnblDrvNum = un_BusShareRam[u8_bus_id_in].st_Tps929120.u8_RepeatRnblMatrixDriverNumber; u8_ValidDrvNum = un_BusShareRam[u8_bus_id_in].st_Tps929120.u8_ValidMatrixDriverNumber; if(un_BusShareRam[u8_bus_id_in].st_Tps929120.st_DrvRnblSts.u8_Refresh_Driver_index == 0) { if( (u8_ValidDrvNum - un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltDrvCount < u8_RepeatRnblDrvNum) && \ (u8_ValidDrvNum - un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltDrvCount > 0) ) { un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltFrmtypeCount = 0; un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_SendCpltDrvCounter = 0; if(u8_frmtype == TPS929120_PWMFRMMODE) { if(g_u8_Tps92912xFixedOperationAddressflg == 1) { if(TPS929120_FIXEDCHIPNUM == 2) { un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_FrmPackDrvNumPerRnbl = u8_RepeatRnblDrvNum; } else if(TPS929120_FIXEDCHIPNUM == 1) { un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_FrmPackDrvNumPerRnbl = TPS929120_FIXEDCHIPNUM + \ (u8_ValidDrvNum - un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltDrvCount); } } else { un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_FrmPackDrvNumPerRnbl = \ (u8_ValidDrvNum - un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltDrvCount) ; } } else { un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_FrmPackDrvNumPerRnbl = \ (u8_ValidDrvNum - un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltDrvCount) ; } } else if(0 == (u8_ValidDrvNum - un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltDrvCount)) { un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltFrmtypeCount = 0; un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_SendCpltDrvCounter = 0; un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltDrvCount = 0; if(u8_ValidDrvNum >= u8_RepeatRnblDrvNum) { un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_FrmPackDrvNumPerRnbl = u8_RepeatRnblDrvNum; } else { un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_FrmPackDrvNumPerRnbl = u8_ValidDrvNum; } } else { un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_CpltFrmtypeCount = 0; un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_SendCpltDrvCounter = 0; un_BusShareRam[u8_bus_id_in].st_Tps929120.st_FrmtypeSts[u8_frmtype].u8_FrmPackDrvNumPerRnbl = u8_RepeatRnblDrvNum; } un_BusShareRam[u8_bus_id_in].st_Tps929120.st_DrvRnblSts.u8_Refresh_Driver_index = 1; } else { /NO CODE/ } }

111 浏览量
filetype

SELECT bs.sample_id, bs.item_id, bs.report_id, bs.order_no, bs.order_id, bs.order_business_type, bs.commission_date, bs.customer_name, bs.applicant, bs.phone, bs.receive_user_name, bs.contract_no, bs.special_requirements, bs.report_org_name, bs.report_org_address, bs.sample_name, bs.standard_instrument_name, bs.complete_day, bs.sample_remark AS remark, bs.standard_instrument_id, bs.sample_no, bs.factory_number, bs.item_name, /*bs.item_quantity,*/ bs.inspection_type, bs.mandatory_flag, bs.test_quantity, bs.sample_state, bs.current_site, bs.plan_complete_date, bs.affix, bs.ranges, bs.grade, bs.factory, bs.calibrat_point, bs.apply_dept, bs.specification, bs.final_fee, bs.service_type, CASE WHEN bs.actual_complete_date IS NOT NULL THEN DATEDIFF( bs.plan_complete_date, bs.actual_complete_date ) ELSE datediff( bs.plan_complete_date, now()) END AS surplus_days, bs.report_no, bs.is_report_back, bs.back_reason AS report_back_reason, bs.is_just_certificate, bs.report_state, bs.temper, bs.humidity, bs.test_result, bs.test_date, bs.next_test_date, bs.test_cycle, bs.test_address, bs.generate_time, bs.point_report_id, bs.is_merge, bs.circulation_flag, bs.item_proposal_fee AS proposal_fee, bs.change_price_reason, bs.test_user_name, bs.group_id, bs.group_name, bs.charging_num, bs.other_fee, bs.receivable_fee, bs.affix_quantity, bs.test_org, bs.out_org_order_no, bs.out_org_sample_no, bs.business_user_name, bs.pdf_path, bs.settlement_state, bs.result_describe, bsa.attach_id FROM view_sample_info bs JOIN bus_sample_report bsr ON bs.report_id = bsr.id JOIN bus_sample sa ON bsr.sample_id = sa.id JOIN bus_sample_attr bsa ON sa.id = bsa.id 根据bs.commission_date 进行排序最近的排上面 bs.commission_date

138 浏览量