FX3U PLC控制器资料 尺寸:185*130m 主控芯片:STM32F103VCT6 电源:DC24V 功能: 1、2路RS232、1路RS485、1路CAN通讯 2、24路独立TTL输出,PC817光耦隔离,继电器输出;20路独立TTL输入,PC817光耦隔离;4路独立TTL输入,6N136高速光耦隔离 3、4个指示灯:电源、模式、运行、通讯 4、2路模拟量输入ADC、2路模拟量输出ADC 序号3资料包含:原理图(AD版本)、PCB(AD和PADS版本)、BOM表,程序源码
拆开快递箱的时候,这枚手掌大小的FX3U控制器让我有点意外。185mm*130mm的机身塞进了工业级配置,铝合金外壳还带着CNC加工的刀痕。掏出万用表实测电源端子,DC24V的标识没骗人,接上开关电源的瞬间,四个状态指示灯齐刷刷亮起,这工业小钢炮算是通电了。
FX3U PLC控制器资料 尺寸:185*130m 主控芯片:STM32F103VCT6 电源:DC24V 功能: 1、2路RS232、1路RS485、1路CAN通讯 2、24路独立TTL输出,PC817光耦隔离,继电器输出;20路独立TTL输入,PC817光耦隔离;4路独立TTL输入,6N136高速光耦隔离 3、4个指示灯:电源、模式、运行、通讯 4、2路模拟量输入ADC、2路模拟量输出ADC 序号3资料包含:原理图(AD版本)、PCB(AD和PADS版本)、BOM表,程序源码
主控STM32F103VCT6的GPIO资源分配挺有意思。看原理图发现,24路继电器输出全部挂在PC817光耦后面,这种设计在车间设备上见过——产线上马达启停时的浪涌电流要是直接怼进MCU,那酸爽不敢想。随手扒了段输出控制的源码:
// 输出端口配置 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 控制继电器动作 void SetRelay(uint8_t ch, BitAction state) { GPIO_WriteBit(GPIOB, (GPIO_Pin_0 << ch), state); Delay_ms(20); // 等待光耦响应 }这里有个细节,控制信号发出后硬等了20ms。用示波器抓波形才发现PC817的响应时间在15ms左右,这20ms的延时算是给光耦留足了余量。不过6N136高速光耦那边就不用这么保守,看输入捕获的代码直接用的中断模式:
// 高速输入配置 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 处理DI0信号跳变 inputBuffer[0] = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0); EXTI_ClearITPendingBit(EXTI_Line0); } }通讯接口这块玩得花,CAN总线的滤波设置有点门道。从源码里翻出这段配置,明显是为工业现场多节点准备的:
CAN_FilterInitTypeDef filter; filter.CAN_FilterNumber = 0; filter.CAN_FilterMode = CAN_FilterMode_IdMask; filter.CAN_FilterScale = CAN_FilterScale_32bit; filter.CAN_FilterIdHigh = 0x0000; filter.CAN_FilterIdLow = 0x0000; filter.CAN_FilterMaskIdHigh = 0x0000; filter.CAN_FilterMaskIdLow = 0x0000; // 接收所有报文 filter.CAN_FilterFIFOAssignment = 0; filter.CAN_FilterActivation = ENABLE; CAN_FilterInit(&filter);模拟量处理部分,ADC的校准参数直接写死在代码里。实测发现,VREF+接的3.3V基准源温漂有点大,得自己在应用层做软件补偿:
// ADC校准值 #define VREF_CAL 1.215f float GetAnalogInput(uint8_t ch) { uint16_t raw = ADC_GetValue(ch); return (raw * VREF_CAL) / 4096.0f; }翻完源码再对照PCB文件,发现数字地和模拟地的分割挺讲究。光耦两侧的地平面用0Ω电阻桥接,这种设计在变频器干扰严重的场合能保命。BOM表里Y电容选的是村田的KRM系列,EMC测试应该能省不少事。
这控制器最让我服气的是开发资料的完整性——从AD格式的原理图到PADS的PCB封装,连STM32的启动文件都带着详细注释。不过程序里有些寄存器操作直接用魔术数字,比如:
// 串口波特率设置 USART1->BRR = 0x1D4C; // 115200 @72MHz这种写法对维护不太友好,改成宏定义会更好。总体来说,这板子拿来改造成小型产线控制器或者智能仓储的中枢节点挺合适,双CAN的设计足够组个冗余网络。下次试试用它的RS485接Modbus仪表群,看能不能扛住车间里的电磁干扰。