2023-08-17 update: summary 中添加开关状态
Intro
在阅读之前有一点需要注意的是,我们的输出、输入,和 PLC 的输出、输入不一样,PLC 的输出和输入是带着电源的,我们的不带电源。这点对输入很好理解,但是对于输出,不能理解成我们输出电压,我们的输出只是一个开关。
Input

一些标记
- 左侧
OP_IN0:外部看到的IN0COMIN1:外部看到的 IN 口的COM口
- 右侧
- ⏚ :地 GND
GPIO1_C0_Z:连到上级芯片(主芯片)。
- 中间
PS2805:光耦,如果12引脚间有电压差,就会发光,会激发34引脚间的光敏二极管,即34导通,也就是 有电压差,开关闭合

右(内)侧电路
先说简单的:
- 工作状态:
34引脚间的光敏二极管导通,GPIO1_C0_Z的电压等于 3 引脚的GND,低电平 - 停止工作状态:
34引脚间的光敏二极管开路断开,GPIO1_C0_Z的电压等于VCC_1V8_S0,高电平
左(外)侧电路
COMIN1高电平OP_IN0低电平,12之间有电压差,中间的光耦工作。OP_IN0高电平,12之间无电压差,中间的光耦不工作。
COMIN1低电平,OP_IN0=1,12之间有电压差,中间的光耦工作OP_IN0低电平,12之间无电压差,中间的光耦不工作。OP_IN0高电平,12之间有电压差,中间的光耦工作。
整体电路
定义:
COMIN1为COMOP_IN0为INGPIO1_C0_Z为GPIO- 高电平为 1, 低电平为 0
那么:
IN = 1 | IN = 0 | |
|---|---|---|
COM = 1 | GPIO = 1 | GPIO = 0 |
COM = 0 | GPIO = 0 | GPIO = 1 |
\(\text{GPIO} = \text{IN} \odot \text{COM}\) 同或关系(相同为1)
上升沿和下降沿看的是 IN,所以:
- 如果
COM口 是高电平,\(\text{GPIO} = \text{IN}\) - 如果
COM口 是低电平,\(\text{GPIO} = \overline{\text{IN}}\),那么实际的上升沿和输入到系统的上升沿是反的
COM口 高电平对应的PLC类型是NPNCOM口 低电平对应的PLC类型是PNP
IN = 1 | IN = 0 | to soc | |
|---|---|---|---|
NPN COM = 1 | GPIO = 1 | GPIO = 0 | No reverse |
PNP COM = 0 | GPIO = 0 | GPIO = 1 | Reverse |
With PLC side
为了理解输出我们需要看完整的电路情况
Simple View
COM = 1 | COM = 0 |
|---|---|
![]() | ![]() |
值:
IN = 1 (PLC 开关断开) | IN = 0 (PLC 开关闭合) | to soc | |
|---|---|---|---|
NPN COM = 1 | GPIO = 1 | GPIO = 0 | No reverse |
PNP COM = 0 | GPIO = 0 | GPIO = 1 | Reverse |
延触发:
NPN, COM=1
| 开关状态 | IN | 外部的沿 | 光耦间电压差 | GPIO | to soc |
|---|---|---|---|---|---|
断开->闭合 | 1->0 | 下降沿 | 无->有 | 1->0 | 下降沿 |
闭合->断开 | 0->1 | 上升沿 | 有->无 | 0->1 | 上升沿 |
PNP,COM=0
| 开关状态 | IN | 外部的沿 | 光耦间电压差 | GPIO | to soc |
|---|---|---|---|---|---|
断开->闭合 | 0->1 | 上升沿 | 无->有 | 1->0 | 下降沿 |
闭合->断开 | 1->0 | 下降沿 | 有->无 | 0->1 | 上升沿 |
Full View
相对更完整的视图
COM = 1, NPN | COM = 0, PNP |
|---|---|
![]() | ![]() |
输出端:

一些标记
- 右(外)侧
OP_OUT0:外部看到的OUT0COMOUT0:外部看到的 OUT 口的COM口BCX55:NPN 三极管
- 左(内)侧
RJ45_3V3:3.3VOUT0_V:连到上级芯片(主芯片),被控制的引脚。
- 中间
PS2805同 INPUT
左(内)侧电路
OUT0_V低电平,12之间有电压差,中间的光耦工作。OUT0_V高电平,12之间无电压差,中间的光耦不工作。
右(外)侧电路
如开始所说,我们的输出的外侧需要接外部电源。由于中间的三极管是 NPN,e极需接低电平,c极需接高电平,所以,COMOUT0 需要连低电平,OP_OUT0 = 1 需要连接高电平。
- 停止工作状态:
34引脚间的光敏二极管开路断开,三极管NPN的b极电平等于COMOUT0=0,三极管截止,OP_OUT0电压等于外部电压也就是0 - 工作状态:
34引脚间的光敏二极管导通,三极管NPN的b极电平等于OP_OUT0=1,三极管导通,OP_OUT0的电压等于COMOUT0 + 三极管分压 ~0(有个问题:为什么不是COMOUT0的电压等于OP_OUT0的电压?这个问题需要考虑负载,但是通常,COM口会直连电源的正负极,负载会在OP_OUT0和电源之间,所以这里是OP_OUT0电平被拉到和COMOUT0一致。有点绕,因为这里没有地)
3 4 光敏二极管 | NPN 的 b 极电压 | 三极管状态 | OP_OUT0 电压 |
|---|---|---|---|
| 断开 | 等于COMOUT0=0 | 截止 | 初始电压 0 |
| 导通 | 等于OP_OUT0 =1然后略大于 0 | 导通 | 拉低 ~0+(三极管分压) |
整体电路
定义:
COMOUT0为COMOP_OUT0为OUTOUT0_V为GPIO- 高电平为 1, 低电平为 0
那么:
COM = 0 | |
|---|---|
GPIO = 1 | OUT = 1 |
GPIO = 0 | OUT = 0 |
With PLC side

COM=0
GPIO 写 | 光耦间电压差 | 开关状态 | OUT | 外部的沿 |
|---|---|---|---|---|
1->0 | 无->有 | 断开->闭合 | 1->0 | 下降沿 |
0->1 | 有->无 | 闭合->断开 | 1->0 | 上升沿 |
Others
最开始说的我们的输出和输入是不带源的,那么如果想让我们的 Output 输出到 Input,需要做的就是外加一个电源。

Summary
由于很多机构只关注自己的开关型号和是否有输出(即上文所述的开关的状态)。而我们的软件给的是电平,所以这里也给出相应的结论:
Input
外部 PLC NPN (COM=1)
| 开关状态 | 外部的沿 | to soc |
|---|---|---|
| 按下 | 下降沿 | 下降沿 |
| 松开 | 上升沿 | 上升沿 |
外部 PLC PNP (COM=0)
| 开关状态 | 外部的沿 | to soc |
|---|---|---|
| 按下 | 上升沿 | 下降沿 |
| 松开 | 下降沿 | 上升沿 |
Output
GPIO 写 | “开关状态” | 外部的电平 |
|---|---|---|
0 | 按下(有输出) | 0 |
1 | 松开(无输出) | 1 |
- 当然我们自己的板子是没有所谓的开关状态的,就是方便和外部对状态。
- Kenexs 软件中的输出高低电平是和外部的电平统一的



