工业PLC梯形图如何精准转为可维护C代码?揭秘IEC 61131-3与ANSI C语义对齐的7层映射协议

信捷 PLC C语言 计数器在POU FC中的使用 使用了CNT_FB_BOD和 CNT_RST_FC两个函数。 阅读详情

第一章:工业PLC梯形图如何精准转为可维护C代码?揭秘IEC 61131-3与ANSI C语义对齐的7层映射协议

将PLC梯形图(LAD)转化为高可靠性、可调试、可版本管理的ANSI C代码,核心在于建立形式化语义映射——而非简单语法替换。IEC 61131-3标准定义了POUs(Program Organization Units)、FB(Function Blocks)、LD(Ladder Diagram)执行模型及扫描周期语义;而ANSI C缺乏原生的周期性执行上下文、隐式边沿检测和线圈驱动逻辑。7层映射协议正是弥合这一鸿沟的结构化桥梁。

语义对齐的关键层级

  • 扫描周期层:将PLC主循环映射为C函数void plc_cycle(void),内含input_update()、program_exec()、output_commit()三阶段
  • 触点/线圈层:常开触点NO(X0) → read_bit(&g_inputs, 0);置位线圈SET(Q1) → 原子写入atomic_set_bit(&g_outputs, 1)
  • 定时器层:TON功能块映射为结构体实例,含elapsed_ms、is_running、is_done字段,并在plc_cycle()中统一调用timer_tick(&ton_01)

典型梯形图片段的C映射示例

/* 梯形图逻辑:X0启动TON,Q0在T0.DN为真时置位 */
static timer_t ton_01 = {0};
static bool q0_output = false;

void plc_cycle(void) {
  bool x0 = read_bit(&g_inputs, 0);
  // TON逻辑:上升沿触发启动,持续计时
  if (x0 && !ton_01.is_running) {
    ton_01.start_time_ms = get_tick_ms();
    ton_01.is_running = true;
  }
  if (ton_01.is_running) {
    uint32_t elapsed = get_tick_ms() - ton_01.start_time_ms;
    ton_01.is_done = (elapsed >= 5000); // T0 = 5.0s
  }
  if (!x0) ton_01.is_running = false; // 复位条件
  q0_output = ton_01.is_done;
  write_bit(&g_outputs, 0, q0_output);
}

7层映射协议要素对照表

映射层IEC 61131-3 元素C语言实现机制
执行模型层Task + Program Scan Cycle主循环函数 + 静态调度器
数据类型层BOOL, INT, DINT, ARRAY[0..9] OF REAL_Bool, int16_t, int32_t, float array[10]
边沿检测层R_TRIG, F_TRIG双采样状态寄存器 + 异或判定

第二章:IEC 61131-3语义模型与C语言抽象层的理论基础与工程解构

2.1 梯形图LD指令集到C控制流图(CFG)的语义保真映射原理

梯形图(Ladder Diagram, LD)作为IEC 61131-3标准的核心编程范式,其并行扫描周期与隐式时序依赖需在转换为C语言CFG时严格保留。
核心映射约束
  • 每个LD网络(Network)映射为独立的C函数,入口点对应扫描周期起始
  • 触点(NO/NC)→ 布尔表达式短路求值,保持扫描顺序语义
  • 线圈(Coil)→ 写入全局IO映像区,禁止编译器重排序
典型LD→C转换示例
// LD: |---[ I0.0 ]----[ /I1.1 ]----( Q0.0 )---|
// 对应C CFG节点序列(含扫描周期同步)
bool scan_cycle_start = true;
Q0_0 = (I0_0 && !I1_1); // 严格左→右求值,反映LD扫描顺序
该代码确保布尔运算次序与LD执行流一致,I0_0与I1_1为volatile限定的IO寄存器地址,防止优化破坏时序语义。
CFG结构保真关键
LD元素CFG节点类型语义约束
串联触点AND链式基本块必须单入口单出口,保持数据依赖边
并联分支汇合节点(Join Node)引入phi函数,统一多路径IO写入

2.2 SFC步进序列与C状态机(State Pattern)的双向构造实践

状态映射一致性设计
SFC步进序列中的Step ID需与C状态机枚举值严格对齐,确保PLC逻辑与嵌入式控制层语义统一:
typedef enum {
    STATE_IDLE = 0,      // 对应SFC Step "S0"
    STATE_HEATING = 1,   // 对应SFC Step "S1"
    STATE_COOLING = 2,   // 对应SFC Step "S2"
} control_state_t;
该枚举定义构成双向构造的锚点:SFC编辑器导出时按序号生成状态跳转表;C运行时通过state_id直接索引动作函数指针数组,避免字符串比对开销。
双向构造验证表
SFC StepC State EnumTransition Condition
S0STATE_IDLEstart_btn == 1
S1STATE_HEATINGtemp >= 85.0f
核心构造流程
  • SFC编译器输出JSON描述符,含Step ID、动作列表及转移条件表达式
  • C代码生成器解析JSON,生成state_handlers[]函数指针数组与条件评估器
  • 运行时通过current_state索引执行动作,并调用对应条件函数触发迁移

2.3 FB(功能块)实例化机制在C结构体+函数指针组合中的落地实现

结构体封装与函数指针绑定
FB 实例的本质是状态(数据)与行为(逻辑)的聚合。C 语言中通过结构体承载成员变量,函数指针数组或独立指针字段绑定执行入口:
typedef struct {
    int32_t input;
    int32_t output;
    bool enable;
    void (*execute)(struct FB_Adder*);
} FB_Adder;

void FB_Adder_exec(FB_Adder* self) {
    if (self->enable) self->output = self->input + 1;
}
该实现将执行逻辑解耦为可替换函数指针,支持同一结构体类型的不同行为注入(如测试桩、安全降级版本)。
实例化流程
  • 静态分配:FB_Adder calc1 = { .execute = FB_Adder_exec };
  • 动态初始化:调用 fb_init() 统一设置默认函数指针与初始状态
函数指针映射表
方法名用途绑定函数示例
execute主逻辑周期执行FB_Adder_exec
reset状态清零FB_Adder_reset

2.4 全局变量/IO映射表与C内存布局(.bss/.data段)的静态绑定策略

内存段语义与绑定时机
全局变量在编译期即被静态分配至特定段:初始化变量进入 .data 段,未初始化变量归入 .bss 段。IO映射表作为常量结构体数组,通常置于 .rodata,但需与 .data 中的驱动状态变量保持地址对齐。
struct io_mapping {
    volatile uint32_t *reg_base;  // 运行时映射地址
    uint16_t id;                  // 硬件ID(编译期确定)
    uint8_t flags;                // 静态配置标志位
} __attribute__((section(".rodata.io_map"))); // 强制段定位
该声明将结构体实例固化于只读段,避免运行时误写;reg_base 虽为指针,其值由链接脚本在加载时填入物理地址,实现编译-链接双阶段绑定。
链接脚本协同机制
  • .bss 段在启动代码中被清零,确保未初始化全局变量安全归零
  • IO映射表地址通过 PROVIDE 符号与驱动模块的 .data 变量建立符号依赖
段名初始化来源典型内容
.dataELF文件镜像带初值的全局变量、函数指针表
.bss运行时清零未赋初值的全局/静态变量

2.5 实时性约束下周期扫描机制(Cycle Time)到C主循环+定时器中断的等效建模

建模本质:时间离散化的双轨协同
周期扫描(Cycle Time)在PLC或AUTOSAR中表征任务最严苛的执行节拍。在裸机C系统中,需将其映射为“主循环骨架 + 定时器中断触发”的确定性组合。
典型实现结构
volatile uint8_t cycle_flag = 0;

// 定时器中断服务程序(如TIM2_IRQHandler,周期=10ms)
void TIM2_IRQHandler(void) {
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
        cycle_flag = 1; // 标志位置位,非阻塞
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}

// 主循环中轮询执行
while(1) {
    if (cycle_flag) {
        app_cycle_task(); // 执行周期逻辑
        cycle_flag = 0;
    }
    idle_task(); // 非周期低优先级任务
}
该模型确保app_cycle_task()严格按硬件定时器精度(如±1个系统时钟周期误差)被调用,避免主循环抖动导致的节拍漂移。
关键参数对照表
周期扫描规范项C等效建模要素
Cycle Time = 10msTIM2自动重装载值 = 10000(假设72MHz APB1,分频后1MHz计数)
Jitter ≤ 1μs中断响应延迟 + flag置位开销 ≤ 1μs(需关闭高优先级中断)

第三章:7层映射协议的核心架构与关键转换规则

3.1 层1–层3:逻辑符号→C表达式、触点→布尔运算、线圈→赋值语义的逐级精炼

PLC梯形图中的基本元素在嵌入式C实现中需进行语义映射:逻辑符号(如常开/常闭触点)对应布尔表达式,线圈对应变量赋值,而整体网络则转化为结构化C语句。
触点到布尔运算的映射
// Q0.0 = I0.1 AND NOT I0.2
bool q0_0 = i0_1 && !i0_2;  // i0_1/i0_2为uint8_t输入寄存器位
该表达式将两个物理输入位经逻辑与非运算后驱动输出位,符合IEC 61131-3中“串联触点”的语义。
典型映射对照表
梯形图元素C语义执行特性
常开触点i0_1直接读取输入缓冲区
输出线圈q0_0 = expr;写入输出映像区,周期末刷新

3.2 层4–层5:POU作用域隔离与C文件模块化、静态局部变量生命周期管理

POU作用域隔离机制
POU(Program Organization Unit)在IEC 61131-3中天然具备独立符号表,其局部变量仅在执行上下文内可见。跨POU调用需显式接口声明,避免命名污染。
C文件级模块化实践
// motor_control.c
static int16_t pwm_duty = 0;        // 模块私有状态
void set_pwm(uint8_t channel, uint16_t value) {
    pwm_duty = (int16_t)value;      // 仅本文件可修改
}
pwm_duty为static修饰的全局变量,链接期隐藏,实现编译单元级封装;set_pwm是唯一受控访问入口。
静态局部变量生命周期
变量类型存储位置初始化时机生存期
static局部变量.data段首次执行时一次程序整个运行期
自动局部变量栈每次进入函数函数调用期间

3.3 层6–层7:诊断信息嵌入与C断言/日志钩子、安全级指令到MISRA-C合规代码生成

诊断信息嵌入机制
通过预编译宏与编译时反射,在关键路径注入轻量级诊断标识,不增加运行时开销。
MISRA-C合规断言封装
/* 符合MISRA-C:2012 Rule 1.3 & 2.7 */  
#define SAFE_ASSERT(cond, err_code) \  
    do { \  
        if (!(cond)) { \  
            __log_hook(__FILE__, __LINE__, err_code); \  
            __safe_abort(); /* non-returning, no side effects */ \  
        } \  
    } while(0)
该宏规避了未定义行为(如多次求值),强制单次求值并绑定诊断上下文;__log_hook为弱符号,可由平台层重定义为CAN帧或UART流输出。
安全指令映射表
源指令目标MISRA-C构造合规条款
asm("wfi")__WFI()(CMSIS内联封装)RULE 8.12, 20.7
*(volatile uint32_t*)0x400FE000 = 0x1MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF)RULE 11.9, 17.7

第四章:面向可维护性的工业级转换工程实践

4.1 基于AST遍历的梯形图源码解析与中间表示(IR)构建实战

梯形图节点到AST的映射规则
梯形图中每个LD元素(如常开触点、线圈、定时器)被解析为AST节点,统一继承BaseNode接口,并携带position、type和attributes字段。
核心遍历器实现
func (v *LDVisitor) Visit(node ast.Node) ast.Node {
    switch n := node.(type) {
    case *ast.ContactNode:
        v.ir.Emit("LOAD", n.Address) // 生成加载操作
    case *ast.CoilNode:
        v.ir.Emit("STORE", n.Address, n.Value)
    }
    return node
}
该访客模式遍历器将LD语义精准映射为三地址码IR指令;Emit方法接收操作符与寄存器地址,支持后续SSA优化。
典型IR指令表
LD元素IR操作码参数说明
常开触点 X0LOAD地址X0,表示读取输入状态
输出线圈 Y1STORE地址Y1 + 布尔值,写入输出映像区

4.2 符号表驱动的变量命名规范化与C注释自动生成(含IEC注释继承)

命名映射规则引擎
系统依据符号表中变量的DataType、Scope和Role三元组,动态生成符合IEC 61131-3语义的C标识符。例如:
/* Generated from SymbolTable entry:
   Name: Motor_Speed_Ref, Type: REAL, Scope: GLOBAL, Role: SETPOINT */
extern volatile float g_f32MotorSpeedRef; // [UNIT: rpm] [RANGE: 0..3000]
该代码块中,前缀g_f32表示全局浮点型变量,后缀Ref保留原始语义;注释行自动注入单位与量程,源自符号表的Unit和Range字段。
IEC注释继承机制
  • 从PLCopen XML符号表提取<Comment>节点内容
  • 按作用域层级合并父级注释(如POU级→FB实例级→变量级)
  • 冲突时以变量级注释优先
注释模板配置表
占位符数据源示例值
{UNIT}SymbolTable.Unitrpm
{DESC}SymbolTable.CommentTarget speed setpoint for main drive

4.3 多厂商PLC(Siemens S7-1200、Rockwell Logix、Codesys)梯形图兼容性适配方案

核心适配层架构
采用中间表示层(IR-LD)统一抽象梯形图语义,屏蔽底层指令集差异。IR-LD定义标准触点、线圈、功能块接口,支持双向转换。
典型转换规则示例
<!-- Siemens S7-1200 → IR-LD -->
<contact type="NO" address="I0.0" id="c1"/>
<coil type="SET" address="Q0.1" src="c1"/>
该XML片段将S7-1200的“常开触点+置位线圈”逻辑映射为IR-LD标准节点;type="SET"确保Logix的OTL与Codesys的SET指令均可据此生成目标代码。
厂商指令映射对照表
IR-LD操作S7-1200LogixCodesys
上升沿检测EUONSR_TRIG.CLK
定时器(TON)TONTONTON

4.4 单元测试框架集成:从LD测试用例自动生成C UT桩与覆盖率验证脚本

自动化桩生成原理
基于LD(Logic Description)测试用例的结构化描述,工具链解析函数签名、参数约束及预期返回,动态生成符合C99标准的stub函数与调用桩。
覆盖率验证脚本核心逻辑
#!/bin/bash
gcovr -r . --exclude='test/.*' --xml > coverage.xml
python3 validate_coverage.py --min-branch 85 --min-line 90 coverage.xml
该脚本调用gcovr聚合GCC编译器生成的.gcda数据,排除测试目录后输出XML格式覆盖率报告,并交由Python校验器比对分支与行覆盖阈值。
LD到C Stub映射规则
LD字段C Stub对应说明
func_name__wrap_func_name采用GCC linker wrap机制重定向调用
return_typestatic return_type stub_ret_val支持全局可设返回值,便于状态驱动测试

第五章:总结与展望

云原生可观测性的演进路径
现代分布式系统已从单一指标监控转向多维度信号融合(Metrics、Logs、Traces、Profiles)。某金融平台在迁移到 Kubernetes 后,通过 OpenTelemetry Collector 统一采集 12 类自定义业务 Span,并注入 service.version 和 deployment.env 标签,使故障定位平均耗时从 47 分钟降至 6.3 分钟。
关键实践建议
  • 在 CI/CD 流水线中嵌入 SLO 验证阶段:使用 PrometheusRule + kube-state-metrics 自动校验部署后 5 分钟内错误率是否低于 0.1%
  • 为关键微服务配置 eBPF 增强型追踪:基于 BCC 工具链捕获 TCP 重传、连接超时等底层网络事件
  • 将 Flame Graph 数据持久化至 ClickHouse,支持按 trace_id 关联 JVM GC 日志与内核调度延迟
典型部署配置片段
# otel-collector-config.yaml
processors:
  batch:
    timeout: 1s
    send_batch_size: 1024
  memory_limiter:
    # 基于容器内存限制动态调整
    limit_mib: 512
    spike_limit_mib: 128
exporters:
  otlp:
    endpoint: "tempo:4317"
    tls:
      insecure: true
主流可观测性工具能力对比
工具原生 Trace 支持eBPF 集成深度日志结构化能力
Tempo✅(Jaeger 兼容)❌(需外部采集器)⚠️(依赖 Loki 处理)
Parca❌(专注 CPU/Heap Profiling)✅(内核级连续剖析)❌
未来技术交汇点

AI 模型推理服务正驱动新范式:将 LLM 作为异常根因分析器——输入 Prometheus 查询结果 JSON、最近 3 小时的 LogQL 输出及 Jaeger 的 span 依赖图,输出带置信度的故障假设链。某电商大促期间,该方案提前 11 分钟识别出 Redis 连接池耗尽引发的级联雪崩。

梯形图转单片机软件手册 本软件功能是将三菱 FX2N 的 PLC 程序转换成 51 单片机 HEX 文件的程序,本软件有相当完善的出错与提示检测 功能(元件范围检测,支持的指令检测,是否 FX2N 的程序文件检测,是否 FX2N 软元件内存数据文件检测等等), 软件支持三菱的 PLC 编程软件:FXGPWIN 与 GX Developer(保存时需要保存为 FXGP 文件) 立即下载

相关推荐

简单使用C语言写梯形图

简单使用C语言写梯形图精简 简单使用C语言写梯形图精简

西门子plc怎么转到c语言,西门子PLC梯形图和指令表相互转换

问:西门子plc梯形图和指令表相互转换有哪位朋友知道啊?还有西门子S7-300里的各个数据存储单元有哪些,分别是存储什么数据的?答:一般你在编辑程序快时,如在插入一个快时,在SIAMTIC管理器中,选定菜单“Insert(插入)/S7Block(S7块)/OrganizationBlock时,其中就有选项”Createdinlanguage”(选择编程语言,LAD/STL/FBD),选定编...

weixin_39889481的博客 2657

基于软PLC编译系统的开发与实现

摘要:为了配合在PC机上运行的软PLC编辑开发系统,使PC机完成相应的控制功能,设计和开发了软PLC编译系统。本文简述了软PLC编译系统的组成以及软PLC梯形图和指令表的遍历算法,介绍了软PLC梯形图与指令表程序相互转换的实现过程。   软PLC控制技术是基于软件和硬件在逻辑功能上等效的思想,采用开放式体系结构,通过软件来实现PLC硬件的功能。软PLC系统由上位机和下位机组成,上位机为用户提供编辑界面和多种编程语言环境,便于用户在PC机上进行PLC程序的编辑,同时还对下位机的一些状态量进行监控,并给下位机发送指令。   用户编辑完PLC的梯形图和指令表程序后,只有通过对程序的编译来获取程序

plc梯形图转c语言,plc梯形图转换成stl程序的实例教程

plc梯形图转换成stl程序的方法问题:plc梯形图转换成stl程序后,如何让stl程序不能还原成lad程序。答:比较简单的做法,把程序转换成STL以后,可以把多段的STL程序归到一个程序段中。还有就是当转换成STL以后,在程序段中会有NOP 0空指令,把出现的NOP 0删掉,也能防止此段程序被转换成梯形图,并且不影响程序的运行。要实现只用STL显示,而不能转化为梯形图,在一个NETWORK内多写...

weixin_34990449的博客 4092

相机标定-张正友棋盘格标定法

(X,Y,Z)为在世界坐标系下一点的物理坐标 ( u , v ) 为该点对应的在像素坐标系下的像素坐标 引入齐次坐标的原因:引入齐次坐标的目的是为了升维,将坐标从二维坐标变为三维坐标。 2.相机成像过程 相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。 (1)世界坐标系(,,) 描述目标在真实世界中的位置引入的参考坐标系。 (2)相机坐标系(,,) ...

qq_41275123的博客 1万+

【crawler笔记】R语言简单动态网页爬虫(rvest包)示例

1、爬虫目标 大家普遍认为Python的爬虫功能强大,但在解决动态加载或者登陆网站时,Python存在一定困难的,相对于一些普通爬虫,使用R语言会更方便。 以https://www.thepaper.cn/为例,爬取首页的新闻(标题、内容、时间),主要采用的是动态网页中常用的httr包。 初始学习时,参考了B站《20分钟入门基于R语言的网络爬虫_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili》的视频,但代码运行出现了报错,所以在原代码上做了修改。 2、代码分析及报错修改 library(rv

seeyouer1205的博客 3275

三菱梯形图转换c语言软件,梯形图转51软件(三菱PMW文件转51)

转换软件支持三菱梯形图软件FXGP/WIN或用GX软件编程后转为FXGP格式的文件,PLC程序转换代码较大,需选用容量超过8K的单片机,如:STC89C52以上AT89C52 以上,软件支持三菱梯形图编程指令如下,此指令外的不能用此转换软件转换。三菱梯形图转换步骤:1、先用三菱梯形图软件FXGP/WIN或用GX软件编程后转为FXGP格式的梯形图文件;2、打开PMW-HEX转换软件;3、设定好你做的...

weixin_39612849的博客 2919

MPC-CBF 控制原理详解

假设系统满足如下离散时间动力学模型xt1fxtutxt∈Xut∈Uxt1​fxt​ut​xt​∈Xut​∈Uxtx_txt​:状态变量,定义域为可行状态集X⊆RnX⊆Rnutu_tut​:控制输入,定义域为控制约束集U⊆RmU⊆Rm系统需满足安全约束,由如下控制障碍函数(CBF)hX→RhX→RCx∈X∣hx≥0C:=x∈X∣hx≥。

m0_54691290的博客 1179

三菱梯形图转换成c语言,三菱PLC编程软件的梯形图程序的生成与批改

下图所示为梯形图视图, 其特征可 用以下名词描写:①光标:一个闪如今梯级里边的标明其时方位的蓝色方形块。②梯级 ( 条 ) :梯形图程序的一个逻辑单元。一个梯级能够包括多个行和列,且悉数的梯级都具有编号。③梯级总线 ( 母线 ) :左母线是指梯形图的开端母线,每一个逻辑行有必要从左母线画起。梯级最右边的是完毕母线即右母线,右母线是不是闪现能够设定。④功用图:在用梯形图编程时,能够运用该栏中的触点、...

weixin_28995139的博客 2214

查看电脑mac地址+主机名+用户名并导出

张三:李四,应公司要求,今天下班前必须将这张表格里面用户电脑的mac地址统计出来!李四:我该怎么办呢?一个一个查看,太没有效率了吧!对了,我可以做一个bat脚本啊!

拥抱着青春 1970

携程登录风控逆向踩坑实录:从滑块到点选验证码,我是如何一步步拿到phantom-token的

本文详细解析了携程登录风控系统的逆向过程,从滑块验证码到点选验证码的破解,再到设备指纹生成和加密协议逆向,最终成功获取phantom-token。文章提供了关键代码示例和实战技巧,帮助开发者理解并绕过复杂的风控机制。

weixin_28049429的博客 970

提示工程+领域知识:DeepSeek在工业控制代码生成中的突破——基于PLC梯形图转C语言的实战

摘要: 在工业自动化领域,将PLC梯形图转换为C语言长期存在效率低、错误率高的问题。汇川技术通过结合DeepSeek大模型与提示工程,在锂电池装配线项目中实现92%的转换准确率,开发周期从2周缩短至3天。关键策略包括:结构化指令(明确硬件映射、实时性约束)、少样本学习(提供典型样板)及思维链引导(分步拆解复杂逻辑)。案例显示,该方法使人工调试时间减少77%,代码执行延迟降低至7.3ms。提示工程通过注入工业领域知识(如寄存器地址计算、协议适配),使AI成为“工业逻辑翻译官”,为行业提供高效、可复用的代码生成

云雾J视界的博客 1928

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1903

PLC梯形图转C语言不是翻译,是重构!——基于IEC 61131-3 Part 8标准的结构化转换框架(内含GSDML兼容性白皮书节选)

解决工业PLC梯形图向C语言转换的语义失真难题,基于IEC 61131-3 Part 8构建结构化重构框架,支持GSDML设备描述兼容性。适用于老旧PLC系统迁移、嵌入式控制器开发及国产化替代场景,提升代码可维护性与跨平台一致性。值得收藏

InitPulse的博客 365

Python 爬虫实战:爬取哔哩哔哩知识区,抓取高赞课程信息

哔哩哔哩(Bilibili)是一个广受欢迎的综合性视频社区,其中的知识区汇聚了大量优质的教育、科普、技术等课程内容。本文将指导读者如何使用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息,并进行数据分析。本文深入探究了利用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息的全流程。从前期的环境搭建、模拟登录,到核心的课程数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。通过此方法所获取的数据,能够助力创作者优化内容、用户发现优质课程、平台洞察用户需求。

u014481728的博客 1135

Vue3 - 完美解决 vite 打包后在本地浏览器直接打开运行,build 打包后双击 index.html 直接以 file 协议运行网站(资源、接口等正常访问,和部署到服务器运行效果一样)

vue3vite怎么支持file协议本地打开,vite打包文件如何支持files协议,支持双击即可打开网页,vue3vite打包后双击本地运行,vue3vite打包后怎么直接在浏览器双击打开访问,vite打包后显示空白,vite如何支持本地file协议打开,vue3vite打包后如何本地查看网站,vue3vite项目打包后本地启动白屏怎么办,vite打包后的代码如何在本地运行,vite+vue3打包在fIle本地index.html打开项目,打包后如何直接打开index.html文件,vue3

🏆 前端领域优质创作者 1万+

plc梯形图如何转c语言,梯形图和指令怎么转换?plc梯形图转换指令表

梯形图和指令怎么转换?plc梯形图转换指令表1 梯形图转换成指令表梯形图转换成指令表是以梯级为单位进行的。对于没有并联支路的梯级,只要根据梯形图元素在梯级中的位置和元素的类型,即可将梯形图转换为指令表。对于包含有并联支路的梯级,可以按照遍历梯形图的方法,一边遍历一边转换。在转换过程中,首先设定1个全局变量nDepth(梯级深度),以确定梯级的深度,然后判断1个梯级是否包含并联支路。如果包含则调用包...

weixin_36433524的博客 9518

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

IEC61131-3标准

IEC61131-3标准

xie__jin__cheng的博客 1952

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【PLC梯形图转C语言实战宝典】:20年自动化专家首度公开3大转换引擎与5类避坑指南

解决工业PLC梯形图向C语言高效转换难题,提供3大专用转换引擎与5类典型避坑指南,覆盖产线改造、国产化替代等真实场景。基于20年自动化经验提炼,确保逻辑保真、可读性强、易集成部署,值得收藏。

CompiGap的博客 476

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

信捷 PLC C语言 简易绝对运动函数BMC_A_DRVA_BODY在POU FC中的使用

来执行简易绝对运动需满足两个条件:外部条件和内部条件,外部条件可以一直为true。设置好简易绝对运动的结构体参数后,让内部条件为true.在以前的文章中有描述传统梯形图的写运动控制程序,本文用C语言写简易绝对运动函数的使用。(4) 如果需要运动到另一个位置,到(2)步,然后(3)步。(1)在监视窗口将external_cond置true;所以要确保:在不同地方的调用运动指令的条件的互斥关系。运动位置到达后,程序会自动复位内部条件。,指令的形式包括梯形图也,功能块函数。2在全局变量表中建立变量。

weixin_39926429的博客 808

信捷PLC运动控制程序:C语言与梯形图实现高效逻辑编程

上次给输送线加了个分拣功能,从改程序到调试成功只用了半天,放以前光等运动控制器调试就得两天起步。可以插入删除程序指令行,编辑程序简单快捷,现在版本可以编辑200步指令程序,根据需求还可以再加,,,可实现复杂逻辑控制,替代运动控制器控制机械手成本很低的。附带操作说明,信捷触摸屏程序和plc程序,还用c语言功能块,都有详细的注释,标准化编程,程序简洁,思路清晰。PLC运动控制程序,信捷plc触摸屏C语言加梯形图实现了通过文本表格设置参数,实现逻辑编程功能。实现的判断输入输出,延时等待,轴运动跳转等功能指令。

QQ68823886的博客 602

信捷C语言

宏定义、变址调用是信捷C语言的特色。

L382441183的博客 942

梯形图转C代码总出错?3大隐性语法陷阱+5步精准校验法,97%工程师忽略的转换一致性保障方案

解决梯形图转C代码错误频发难题,PLC C语言梯形图转换工具助您规避3大隐性语法陷阱,通过5步精准校验保障逻辑一致性。适用于工业自动化开发与老旧系统迁移,提升转换准确率达97%,值得收藏。

VarPerch的博客 235

信捷PLC如何使用c函数

简介: 使用信捷plc运用c计算使用的过程。 工具原料: 1.信捷PLC ,XD,XLl,XK,XG等系列都可以。 2.程序下载线或有网口的可以用网线。 3.信捷编程软件本案例采用XDPPro3.53。 4.电脑 方法步骤: 1.打开编程软件 2.plc与编程软件建立连接 3.是否有合适自己的算术包含在里面(双击即可引用) 4.如果没有自己建立运算。函数功能块右键新建源文件。 5.设定好信息点击确定 6.双击新建的源文件。 7.编写程序 #define SysRegAddr_HD_D_HM_M d

weixin_43867834的博客 1万+

梯形图调用c语言编写程序,简单使用C语言写梯形图精简V2.0.pdf

简单使用C语言写梯形图精简V2.0C语言实现梯形图写法1: AND2: LDI3: ANDB4: ANDP5: ORB6: C17: T08: MPS19: LDF1...

weixin_29889741的博客 1266
上一篇: Java大文件上传实战(支持断点续传+异常恢复)——资深架构师20年经验总结
下一篇: 【嵌入式安全红线预警】:立即停用这4类“伪静态分析”工具!2024最新CVE漏洞影响面与替代方案速查表
VarPerch
博客等级 码龄1年 146粉丝 1961原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值