Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 339

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 392

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 394
Joyber 的博客

abstract 抽象类(PHP)

作用

  1. 约束子类必须实现指定方法:抽象方法只有声明、没有实现,子类继承后必须重写这个抽象方法,否则子类也得标记为 abstract,不能实例化。用来统一接口规范。
  2. 可以放通用共用代码:和接口 interface 不一样,抽象类里面可以写已经实现好的普通方法、属性,子类直接复用。
  3. 本身不能 new 实例,只能被继承,用来做基类、模板骨架(模板方法模式非常常用)。

对比一句话:

  • interface:全部都是契约,不能写实现,一个类可以多实现
  • abstract class:一半契约(abstract方法)+一半现成代码,只能单继承

写法规则(PHP)

  1. 类前面加 abstract
  2. 抽象方法:前面 abstract,没有函数体,以分号结尾,不能有 {}
  3. 普通方法、属性、常量正常写,随便写实现
  4. 子类 extends 抽象类,必须全部实现父类所有抽象方法
  5. 抽象类不能 new

最简示例

<?php
abstract class CarrierBase
{
    // 抽象方法:子类必须实现
    abstract public function sendOrder(array $orderData): bool;
    abstract public function cancelOrder(int $orderId): bool;

    // 已经实现的公共方法,子类直接继承复用
    protected function log(string $msg): void
    {
        echo date('Y-m-d H:i:s') . ' ' . $msg . PHP_EOL;
    }
}

// 子类实现抽象类
class SelfCourierCarrier extends CarrierBase
{
    public function sendOrder(array $orderData): bool
    {
        $this->log('自有骑手接单:' . $orderData['id']);
        return true;
    }

    public function cancelOrder(int $orderId): bool
    {
        $this->log('自有骑手取消订单:' . $orderId);
        return true;
    }
}

// $base = new CarrierBase(); // 报错!抽象类不能实例化
$carrier = new SelfCourierCarrier();
$carrier->sendOrder(['id' => 1001]);

结合你上面跑腿运力场景的例子(贴合你的 CarrierInterface)

你现在是 CarrierInterface 接口;如果很多运力都共用一套日志、组装请求的逻辑,就适合改成抽象基类:

abstract class AbstractCarrier implements CarrierInterface
{
    // 公共通用能力,所有运力复用
    protected function buildOrderParam(array $raw): array
    {
        return [
            'order_no' => $raw['order_sn'],
            'addr_from' => $raw['from_address'],
            'addr_to' => $raw['to_address'],
        ];
    }
}

class SelfCourierCarrier extends AbstractCarrier
{
    public function dispatch(array $order): bool
    {
        $param = $this->buildOrderParam($order);
        // 自有骑手分发逻辑
        return true;
    }
}

class ThirdPartyCarrier extends AbstractCarrier
{
    public function dispatch(array $order): bool
    {
        $param = $this->buildOrderParam($order);
        // 调用UU/闪送接口
        return true;
    }
}

重点坑点

  1. 抽象方法不能写body:abstract public func(); ✅,带大括号 ❌
  2. 子类实现的方法,访问权限不能比父抽象方法更严格(父public,子类不能改成protected/private)
  3. 抽象类可以没有任何抽象方法(可以,但意义不大,仅用来禁止直接new基类)
  4. 一个类只能继承一个抽象类(PHP单继承)

什么时候选 abstract,什么时候选 interface

  • 多个子类有大量重复共用代码 → abstract 抽象类
  • 只定义调用契约、没有公共逻辑、一个类需要多套契约 → interface

image.png

这是 Mermaid 语法,专门用来在 Markdown 里画流程图,很多平台支持:Typora、语雀、飞书文档、Gitlab、Github、Notion、Trae/VSCode 插件等

你这段是 graph TD,TD = Top Down,从上到下的流程图

基础语法速记

graph TD
    起点 --> 终点       // 箭头连线
    节点ID["显示文字"]  // 方框节点,最常用
    节点ID(圆角文字)    // 圆角框
    节点ID{判断}        // 菱形判断框
graph TD:从上往下
graph LR:从左往右(LR=Left Right,后端架构图最常用)

拆解你这段代码

graph TD
    A["跑腿员端 API (api/errand)"] --> S1["ErrandCourierService"]
    A --> S2["ErrandOrderService"]
    B["管理平台 API (admin/errand)"] --> S1
    B --> S3["ErrandCarrierService"]
    C["用户端下单 (api ErrandController)"] --> S2
    S3 --> M["CarrierManager (运力解析)"]
    M --> I["CarrierInterface"]
    I --> R1["SelfCourierCarrier (自有骑手)"]
    I --> R2["ThirdPartyCarrier (UU/闪送 预留)"]
    S2 --> L["ErrandOrderStatusLog / ErrandTimeNode / ErrandWorkRecord"]
  • A、S1、S2:是节点唯一ID,随便起名,只用来内部连线,不展示
  • ["xxx"]:方括号,矩形框,显示里面的文字
  • -->:单向箭头,表示依赖/调用关系(A 调用 S1)

快速上手规则(记住4条就够用)

  1. 开头固定:graph TD(竖向)或者 graph LR(横向,推荐画架构)
  2. 每个节点格式:ID["展示文本"],ID不能重复
  3. 连线:ID1 --> ID2
  4. 一行一条连线,换行不影响

改成横向架构图版本(后端结构图一般用LR更好看)

graph LR
    A["跑腿员端 API (api/errand)"] --> S1["ErrandCourierService"]
    A --> S2["ErrandOrderService"]
    B["管理平台 API (admin/errand)"] --> S1
    B --> S3["ErrandCarrierService"]
    C["用户端下单 (api ErrandController)"] --> S2
    S3 --> M["CarrierManager (运力解析)"]
    M --> I["CarrierInterface"]
    I --> R1["SelfCourierCarrier (自有骑手)"]
    I --> R2["ThirdPartyCarrier (UU/闪送 预留)"]
    S2 --> L["ErrandOrderStatusLog / ErrandTimeNode / ErrandWorkRecord"]

怎么运行预览

VSCode 装插件:Markdown Preview Mermaid Support,打开md直接看;
飞书/语雀文档,直接粘贴这段代码,选择Mermaid代码块即可渲染。

扩展小补充(你画架构常用)

  • 虚线箭头:-.->
  • 标注文字箭头:A -- 调用 --> B

    graph LR
    A["服务A"] -- 同步调用 --> B["服务B"]
    B -.-> C["异步回调"]

Hyperf 全功能学习实践清单(逐条落地,可直接照着做)

前置准备(先完成,所有练习共用一套环境)

  1. 环境:PHP8.1+、Swoole 5.x(开启协程、http2、openssl);可选 Swow 无扩展模式
  2. 初始化项目:composer create-project hyperf/hyperf-skeleton hyperf-demo
  3. 统一中间件:Docker 安装 Nacos / Consul(服务注册)、MySQL、Redis、RabbitMQ、Jaeger(链路追踪)
  4. 学习原则:单个功能独立跑通 → 多个功能组合成微服务集群 → 整合为小游戏/长连接项目

一、RPC 通信:JSON-RPC + gRPC(微服务核心)

1)JSON-RPC 服务端+客户端

学习目标:实现服务提供方注册、消费方远程调用,基于注解开发

  1. 安装组件

    composer require hyperf/json-rpc hyperf/rpc-server hyperf/rpc-client
  2. 实践步骤
  3. 新建接口 UserServiceInterface,定义方法
  4. 服务提供者:用 @RpcService 注解发布服务,开启注册中心配置
  5. 服务消费者:配置 consumers,依赖注入接口直接调用
  6. 测试:启动两个服务,客户端调用服务端接口,拿到返回值
  7. 进阶:增加RPC参数校验、异常捕获、超时设置

2)gRPC 服务(http2二进制协议)

学习目标:基于proto文件生成代码,搭建gRPC服务端与客户端

  1. 安装protobuf扩展+hyperf gRPC组件
  2. 实践步骤
  3. 编写 .proto 协议文件(定义服务、入参、出参)
  4. 命令行自动生成PHP代码
  5. 配置server.php开启grpc服务端口,实现接口业务逻辑
  6. 客户端调用,完成跨服务二进制通信
  7. 验收:curl/grpc客户端成功调用,查看http2协议日志

二、服务注册与发现(Nacos / Consul)

学习目标:服务自动注册、自动发现,不用硬写IP端口

  1. 组件安装:composer require hyperf/service-register
  2. 二选一练习(优先Nacos,国内主流)

    方案A:Nacos(阿里云,小游戏项目首选)

  3. Docker启动Nacos单机版
  4. RPC服务端增加注解 publishTo="nacos",自动把服务注册到Nacos
  5. 客户端配置注册中心地址,自动从Nacos拉取服务节点
  6. 测试:关闭其中一个服务实例,客户端自动切换到其他节点

方案B:Consul

  1. 启动Consul服务
  2. 修改配置,将RPC服务注册到Consul
  3. 验证:在Consul管理面板看到在线服务实例

验收要点

  • 服务启动自动注册,停止自动下线
  • 客户端无需写死IP,动态获取服务地址

三、负载均衡(内置LB组件)

学习目标:多实例服务自动轮询/随机调用,实现流量分发

  1. 组件:hyperf/load-balancer(框架内置,无需额外安装)
  2. 实践步骤
    1)启动同一个RPC服务,开启3个不同端口实例(多节点集群)
    2)客户端配置负载均衡策略:
  3. 随机(random)
  4. 轮询(round-robin,默认)
  5. 权重轮询(weighted-round-robin)
    3)循环调用接口,打印当前调用到的节点,验证负载分发效果
    4)进阶:节点故障剔除(健康检测)

四、熔断降级(服务治理,防止雪崩)

学习目标:服务调用失败时自动熔断,保护下游服务,避免连环崩溃

  1. 组件:composer require hyperf/circuit-breaker
  2. 实践步骤
    1)给RPC远程调用增加熔断注解 @CircuitBreaker
    2)配置熔断规则:失败率阈值、熔断窗口期、半开重试次数
    3)制造异常:让下游服务持续报错,观察熔断器状态变化(关闭→打开→半开)
    4)配置降级策略:熔断触发后直接返回兜底数据,不继续请求下游
    5)拓展:增加限流(令牌桶/漏桶)+熔断组合使用

五、分布式追踪(链路追踪 Tracing)

学习目标:全链路追踪请求,查看整条调用链耗时、调用节点,排查慢接口

  1. 组件:composer require hyperf/tracer jaeger-client
  2. 实践步骤
    1)Docker启动Jaeger链路追踪服务
    2)配置tracer.php,开启RPC、HTTP、数据库调用自动埋点
    3)发起一次完整调用:HTTP接口 → JSON-RPC服务 → MySQL查询 → Redis缓存
    4)打开Jaeger后台,查看整条链路:每个环节耗时、调用顺序、异常日志
    5)进阶:把TraceId写入日志,实现日志与链路一一对应

六、协程连接池(MySQL / Redis / RabbitMQ,协程必练核心)

协程常驻内存,必须使用连接池,否则会爆连接、内存泄漏

1)MySQL 协程连接池

  1. 组件:hyperf/database(框架自带)
  2. 练习内容
  3. 配置pool参数:最大连接数、最小空闲连接、连接超时、心跳检测
  4. 开启协程并发,同时发起200条SQL查询,观察连接池复用连接,不新建大量连接
  5. 测试:连接耗尽时自动排队等待,避免报错
  6. 使用协程版Eloquent ORM完成增删改查

2)Redis 协程连接池

  1. 组件:hyperf/redis
  2. 练习内容
  3. 配置Redis连接池,设置最大连接、空闲超时
  4. 并发协程批量set/get,验证连接复用
  5. 练习:分布式锁、缓存击穿、缓存降级

3)RabbitMQ 协程连接池(消息队列)

  1. 组件:composer require hyperf/amqp
  2. 练习内容
  3. 配置AMQP连接池,避免频繁创建销毁连接
  4. 生产者:协程批量投递消息
  5. 消费者:多协程消费消息,自动复用连接
  6. 实现消息重试、死信队列

验收标准

并发请求下,连接数量稳定在配置区间,不会无限暴涨。


七、秒级定时任务 Crontab(毫秒级定时,优于Linux crontab)

  1. 组件:hyperf/crontab(内置)
  2. 实践步骤
    1)创建定时任务类,使用注解 @Crontab
    2)练习两种定时规则:
  3. 标准cron表达式(分/时/日/月/周)
  4. 秒级定时:每5秒执行一次、每100毫秒执行一次
    3)开启多进程执行定时任务,避免任务阻塞互相影响
    4)进阶:定时任务分布式锁(Redis锁),防止多实例重复执行任务

八、自定义进程(独立进程处理任务,不阻塞HTTP/RPC服务)

  1. 学习目标:创建独立Worker进程,处理异步任务、消息消费、后台定时业务
  2. 实践步骤
    1)创建自定义进程类,继承 AbstractProcess
    2)配置process.php,设置进程数量、进程名称
    3)两种场景练习:
  3. 场景1:独立进程消费RabbitMQ消息,不占用业务Worker
  4. 场景2:创建心跳进程,定时上报服务健康状态到注册中心
    4)测试:主服务重启不影响常驻后台进程;进程异常自动重启

九、WebSocket 长连接(小游戏、IM聊天、实时推送必备)

  1. 组件:composer require hyperf/websocket-server
  2. 实践步骤
    1)配置server.php,开启WebSocket服务端口
    2)实现握手、消息接收、消息推送、客户端下线事件
    3)练习功能:
  3. 一对一私聊(用户ID绑定连接fd)
  4. 全员广播(小游戏全服推送公告)
  5. 房间分组(游戏房间内消息互通)
  6. 断线重连、心跳保活,防止连接被系统断开
    4)客户端:用JS WebSocket连接服务端,收发消息
    5)进阶:结合Redis发布订阅,实现多服务实例之间消息互通(分布式WebSocket)

十、配套高级能力(DI容器 + AOP + 协程上下文Context,Hyperf核心优势)

1)DI依赖注入 + 注解注入

  1. 练习构造器注入、属性注入、接口绑定实现类
  2. 把所有服务类全部交给容器管理,不手动new对象

2)AOP面向切面(拦截方法,统一做日志、鉴权、埋点)

  1. 创建切面类,拦截控制器、RPC方法
  2. 实现统一日志记录、接口鉴权、参数校验、异常捕获
  3. 练习前置通知、后置通知、异常通知

3)协程上下文 Context(协程最容易踩坑,必练)

  1. 练习用 Context::set() / Context::get() 存储当前请求唯一数据(trace_id、用户ID)
  2. 对比:全局变量在协程并发下会互相污染,Context可以完美隔离不同协程请求数据
  3. 子协程上下文传递,避免子协程拿不到父协程数据

十一、项目整合实战(把上面所有组件拼成3个完整项目)

项目1:微服务RPC集群(用户服务+订单服务+商品服务)

用到:JSON-RPC + Nacos注册发现 + 负载均衡 + 熔断降级 + 链路追踪 + MySQL/Redis连接池

项目2:小游戏后端服务(推荐首选)

用到:WebSocket长连接 + 秒级定时任务 + 自定义进程消费队列 + 分布式锁 + 消息队列RabbitMQ

项目3:API网关项目

用到:HTTP服务 + 路由转发 + RPC调用下游微服务 + 全局AOP鉴权 + 限流熔断


十二、打包部署(Hyperf Box二进制打包)

  1. 练习:使用Hyperf Box把整个项目打包成单文件phar二进制程序
  2. 实现:服务器不需要安装composer、不需要维护vendor,直接一行命令启动服务
  3. 编写Dockerfile,容器化部署整套微服务集群

学习进度规划(按天执行)

第1天:环境搭建 + DI/AOP + Context协程上下文 + 连接池(MySQL/Redis)
第2天:JSON-RPC + gRPC + Nacos服务注册发现 + 负载均衡
第3天:熔断降级 + 分布式链路追踪Jaeger
第4天:RabbitMQ消息队列 + 自定义进程 + 秒级定时任务Crontab
第5天:WebSocket长连接 + 分布式IM消息推送
第6~7天:整合为小游戏后端 + 微服务集群 + 打包容器部署

一、模拟面试类(优先看,完整还原面试场景,适合你转行自测)

  1. 智兰博PLC培训《电气工程师模拟面试(1)》
    亮点:完整真人面试对话,面试官连续提问1200/1500区别、V90伺服、Modbus、出差问题,就是非标公司真实面试流程,能感受面试官提问节奏、怎么组织话术回答。
  2. 辉煌代英丰《PLC面试这些问题全掌握就OK》
    亮点:高频简答合集,扫描周期、输出点无信号排查、编程语言、出差薪资问答,适合碎片背诵。
  3. 玩工控的Jason《自动化十问十答:PLC面试篇》
    亮点:重点讲【通讯故障排查思路】,强调不要死背答案,学会分步定位故障,面试最加分。

二、博途核心考点专项(FB/FC/DB、程序结构,面试必考题)

  1. 李老师讲重点《博图 OB/FC/FB/DB,新手90%卡在这一步》
    亮点:通俗比喻讲清FC无记忆、FB带背景DB,优化DB/非优化DB区别,这个是西门子面试最高频考点。
  2. 李老师讲重点《通过这4道题 彻底搞懂 数据类型和数据结构》
    亮点:DB块地址、高低字节、Real浮点数寻址面试计算题,很多面试官喜欢现场提问。
  3. 阿伟码控《一个视频讲透FB和FC的区别和使用方法》
    亮点:用业务需求演变来讲,适合理解什么时候封装FB,结构化编程面试必问。

三、通讯&现场调试类(区分“只会仿真”和能上岗的工程师,权重最高)

  1. 小灰灰玩自动化《现场PLC通讯不上怎么办?》
    亮点:Modbus RTU排查流程:A/B线、站点冲突、波特率、终端电阻,面试标准排查话术。
  2. 微电赵老师PLC《PLC以前正常突然通信失败的原因》
    亮点:讲容易忽略的坑:24V压降、接头氧化、干扰,对应面试“偶发停机、随机掉线”的回答思路。
  3. 旭科拓-电控李工1《电工不会调试?看完这8步直接出师!》
    亮点:上电前检查、IO单点测试、强制测试、调试完整流程,面试官很爱问:你拿到一台新设备怎么开始调试?
  4. 郑鼎PLC侯俊霞《手把手教你PLC通信项目案例》
    亮点:博途1200 S7通讯、Modbus TCP实操演示,PN通讯、跨PLC数据交互。

四、B站长系列(系统性,适合长线复习,搜索标题即可)

B站搜索标题:
  1. 《西门子S7-1200/1500博途全套教程》(工控老马):运动控制、V90伺服、Profinet、工艺对象,面试运动控制题全覆盖
  2. 《PLC电气工程师面试合集》(PLC老杨):专门整理面试专题,含安全回路、急停、干扰、Eplan相关问题
  3. 《TIA博途结构化编程实战》:FB封装、标准化程序框架,回答“你怎么写规范的项目程序”

五、观看顺序建议(贴合你的面试题库)

  1. 先看【模拟面试视频】,熟悉提问节奏,先知道面试官喜欢怎么问
  2. 再刷 OB/FB/FC/DB、扫描周期、数据类型 基础考点
  3. 重点攻坚:Profinet、Modbus、现场故障排查、上电调试(这是新人拉开差距的地方)
  4. 最后补伺服运动控制、安全回路、HMI、OPC UA拔高题

避坑提醒

很多短视频只背标准答案,面试的时候面试官会顺着答案继续深挖,优先看带现场故障思路、实操演示的视频,不要只背文字。

西门子TIA 博途 PLC 电气工程师面试题库

适配:零基础培训转行、助理工程师、1年内新手面试,非标自动化方向(S7-1200/1500为主)
分4大块:基础理论、博途软件&程序、总线通讯、现场调试安全;附带参考回答,方便自测

一、基础理论题(必问,筛底子)

  1. PLC由哪几个主要部分组成?
    参考:CPU、存储单元、输入模块DI、输出模块DO、模拟量AI/AO、通信接口、电源。
  2. NPN和PNP传感器区别,西门子1200/1500默认支持哪一类?
    参考:NPN:输出低电平;PNP:输出高电平。西门子DI默认源型,优先PNP。
  3. 什么是DI、DO、AI、AO,举应用例子?
    参考:DI数字输入(光电、急停、限位);DO数字输出(电磁阀、指示灯);AI模拟输入(压力、温度变送器4-20mA);AO模拟输出(变频器给定速度)。
  4. 24VDC直流信号,常见故障有哪些?
    参考:线路虚接、短路、压降过大、接地干扰、传感器供电损坏。
  5. 定时器TON、TOF、TP分别是什么作用?
    参考:TON:通电延时;TOF:断电延时;TP:单脉冲定时器,触发输出固定时长脉冲。
  6. FB和FC的区别?背景DB是什么?
    参考:FC:函数,无自带存储,临时变量断电丢失;FB:功能块,配套背景DB,内部变量状态可以保存。背景DB专门存放FB的静态数据。
  7. OB1是什么OB块?还有哪些常用OB?
    参考:OB1主循环块,每个周期循环执行;OB100初始化块(上电只跑一次);OB80循环超时、OB82诊断中断(故障触发)。
  8. 全局DB和背景DB区别?
    参考:全局DB:共享数据,所有FC/FB都可以读写;背景DB:依附某个FB,专门给这个FB存参数、状态。

二、博途软件、编程相关(高频)

  1. 博途下载PLC程序,“在线和诊断”里面,诊断缓冲区是干嘛的?
    参考:记录PLC报警、故障、停机原因,排查CPU停机、报错最核心工具。
  2. 什么是工艺对象?1200/1500伺服定位用什么工艺对象?
    参考:工艺对象是封装好的运动控制功能块;轴工艺对象,用来回零、定位、速度控制。
  3. 伺服的绝对定位、相对定位区别?
    参考:绝对定位:目标位置是相对于机械原点;相对定位:在上一次位置基础上移动增量距离。
  4. 伺服回零有哪几种方式?
    参考:主动回零、被动回零、直接设置原点(归位)。
  5. 变量监控的时候,“强制”和“修改”有什么区别?风险是什么?
    参考:修改:只当前周期生效;强制:锁死这个点位的值,不受程序控制。⚠️现场强制有撞机风险,调试完必须取消强制。
  6. 为什么推荐结构化编程,不建议全部写在OB1里面?
    参考:逻辑清晰、方便复用、方便多人协作、后期维护改逻辑不容易出错。
  7. 博途编译报错和警告有什么不同?
    参考:报错:程序无法下载;警告:语法没问题可以下载,但是存在隐患,比如变量未使用。
  8. 访问DB块变量,优化的DB和非优化DB区别?
    参考:优化DB:变量偏移地址由PLC自动分配,不能按绝对地址访问,速度更快,新项目推荐;非优化DB有固定偏移,可以用指针、和上位机老协议对接。

三、通讯类面试题(面试分水岭,会这个优先录取)

  1. Profinet是什么?是总线还是协议?
    参考:工业以太网总线协议,西门子主推,实时性高,用来连接伺服、远程IO、视觉、机器人。
  2. Profinet设备掉线,你怎么一步步排查?
    参考:①看拓扑图,设备是否打红;②检查网线、水晶头;③检查设备供电;④核对设备名称、IP;⑤检查屏蔽接地;⑥交换机端口。
  3. Modbus TCP 和 Modbus RTU区别?
    参考:TCP走网口以太网;RTU走485串口;RTU传输距离更远,TCP速度更快。
  4. Modbus通讯经常丢包、读取不稳定,怎么处理?
    参考:检查485A/B线有没有接反、终端电阻、屏蔽接地、轮询间隔不要太快,增加超时重试。
  5. 什么是OPC UA?一般用来做什么?
    参考:跨平台通用通讯协议,PLC和上位机、MES、数据库对接上传生产数据。
  6. S7-PCT工具是干嘛的?
    参考:给Profinet设备分配设备名称,PN设备必须设备名匹配才能入网,只改IP不行。

四、现场调试、安全、实操类(区分新手和只会仿真的人,权重最高)

  1. 设备上电之前,你会做哪些检查?
    参考:断电状态,用万用表测:24V、AC220有没有短路;动力线和信号线分开;接线端子紧固;急停回路单独确认。
  2. 急停回路一般怎么设计,为什么急停不建议只靠程序做?
    参考:急停属于安全回路,硬件硬串,切断动力电源。程序有失效风险,不能作为唯一安全手段,安全规范强制要求硬件回路。
  3. 什么是信号干扰?哪些现象是干扰导致?怎么解决?
    参考:干扰来源:动力电缆、变频器、伺服动力线;现象:传感器信号乱跳、总线随机掉线、AI数值漂移。处理:屏蔽单端接地、强弱电线缆分开走线、增加磁环、降低接地电阻。
  4. 设备偶发停机,没有固定报错,很难复现,你从哪几个方向查?
    参考:优先查接线虚接、供电压降、接地、干扰、传感器老化。
  5. 调试的时候,伺服跟随误差报警是什么原因?
    参考:负载过重、加速度设置太大、机械卡顿、编码器接线不良、增益参数不合适。
  6. 客户要求修改工艺,改程序之前你会做什么?
    参考:先备份当前完整程序,记录版本,修改完成后单独测试,再交给客户试机。
  7. 项目交付,你需要交付哪些文档?
    参考:PLC源程序、HMI画面、IO分配表、电气原理图、操作手册、报警清单。
  8. 调试撞机了,第一时间怎么做?
    参考:立刻拍下急停,断电,检查机械、伺服有无损坏,再复盘程序限位、原位、互锁逻辑漏洞。

五、拔高加分题(1~3年工程师,面试高薪岗位)

  1. 多轴电子凸轮、电子齿轮是什么场景使用?
  2. F-CPU安全PLC,安全DI/DO和普通DI/DO区别?
  3. 多台1500PLC之间PN通讯怎么做数据交互?
  4. 视觉相机、机器人和PLC之间一般交互哪些信号?
  5. MES追溯,条码扫码,PLC一般上传哪些数据?

六、HR综合提问(必问)

  1. 能不能接受出差?非标行业基本都要现场出差,短则几天长则一两个月
  2. 加班能不能接受?赶项目周期的时候加班是常态
  3. 之前有没有独立负责设备调试项目?(培训学员如实说:目前仿真练习,希望跟着项目积累现场经验)
  4. 你未来的规划?(参考回答:先吃透西门子博途,积累整线调试经验,慢慢独立承接项目)

✅ 使用建议

  1. 自测方式:遮住参考答案口述,说不出来的点回头去补;
  2. 面试技巧:不要只背答案,面试官最喜欢追问“你现场遇到过XX故障吗,怎么处理”;
  3. 转行新人定位:大方承认缺少真机现场经验,重点突出基础、学习能力、愿意出差吃苦。