实时时钟模块配置:
三菱PLC的FX5U系列内置实时时钟(RTC),可通过工程工具或指令(如TWR、TRD)进行时间设置和读取。
时间数据包括年、月、日、时、分、秒和星期,支持24小时制。
时间读取指令:
使用
TRD
指令可从RTC读取当前时间,数据存储在特殊辅助寄存器(如D8013-D8019)。示例代码展示了如何读取时间到数据寄存器(如D10-D16)。
动态密码生成算法:
一种常见的方法是使用时间基一次性密码(TOTP)算法,结合当前时间和密钥生成动态密码。
算法示例包括PRESENT和SPECK分组密码,用于加密时间值生成密码。
密码验证逻辑:
验证方检查密码接收时间与最近身份验证时间的差值,确保在容忍时间内。
使用分组密码算法对密码进行解密和验证。
示例程序分析:
提供了动态密码解锁程序的示例,包括授权天数设置、随机码生成和永久密码功能。
程序占用内存和源代码空间,需留意PLC存储空间大小。
安全性和可靠性:
动态密码方案提高了系统安全性,防止未经授权的访问。
密码生成和验证过程需确保可靠性,避免被轻易破解。
编程软件和语言:
使用GX Works2或GX Works3编程软件,支持梯形图(Ladder Diagram)和结构化文本(ST)等语言。
示例代码展示了如何使用ST语言实现密码生成和验证逻辑。
实际应用场景:
时间变量密码程序适用于需要定期更新密码的自动化系统,如设备授权管理、临时访问控制等。
通过HMI界面输入和显示密码,提高用户体验。
以下为您详细介绍三菱PLC时间变量密码程序的实现方法,包含具体步骤和示例代码:
一、实现原理
通过PLC的实时时钟(RTC)模块获取当前时间,结合加密算法生成动态密码。验证方需输入正确的时间变量密码才能完成设备解锁或授权操作。
二、关键步骤
1. 配置RTC模块
内置时钟设置:
使用TWR
(Time Write)指令写入初始时间,或通过编程软件(GX Works2/3)的“时钟设置”菜单配置。
示例:ladder
-- 将D10-D16中的预设时间写入RTC LD X0 -- 触发信号(如首次上电) MOV K2025 D10 -- 年(4位) MOV K4 D11 -- 月 MOV K15 D12 -- 日 MOV K14 D13 -- 时(24小时制) MOV K30 D14 -- 分 MOV K0 D15 -- 秒 MOV K1 D16 -- 星期(0=周日) TWR D10 D16 -- 执行时间写入
2. 读取当前时间
使用
TRD
指令:
从RTC读取时间到数据寄存器(如D20-D26)。
示例:ladder
-- 读取RTC时间到D20-D26 LD X1 -- 周期性触发(如每秒) TRD D20 -- 执行时间读取 -- D20=年,D21=月,D22=日,D23=时,D24=分,D25=秒,D26=星期
3. 生成动态密码
时间基算法(TOTP):
提取时间变量(如时+分+秒),结合密钥进行加密运算。
示例(简化版):structured-text
-- 使用时、分、秒生成6位密码 hour := D23; minute := D24; second := D25; -- 加密运算(示例:取后6位) raw_value := (hour * 3600 + minute * 60 + second) * 12345; password := MOD(raw_value, 1000000); -- 将密码转换为字符串格式(如"123456") password_str := STR(password, 6);
4. 密码验证逻辑
比较输入与生成值:
通过HMI输入6位密码,与PLC生成的密码比对。
示例:ladder
-- 假设输入密码存储在D30-D35(ASCII码) LD X2 -- 输入完成信号 CMP D30 K'1' -- 逐位比较 CMP D31 K'2' CMP D32 K'3' CMP D33 K'4' CMP D34 K'5' CMP D35 K'6' ANDP -- 所有位匹配时触发 OUT Y0 -- 解锁成功,驱动输出
三、完整示例程序
1. 动态密码生成程序
structured-text
-- 初始化密钥(示例值) ConST SECRET_KEY : INT := 123456;
-- 生成密码函数 FUNCTION Generate_Password : STRING(6) VAR current_time : DT; hour, minute, second : INT; raw_value : DINT; password : INT; BEGIN -- 读取当前时间 current_time := TIME(); hour := current_time.HOUR; minute := current_time.MINUTE; second := current_time.SECOND;
-- 计算动态值 raw_value := (hour * 3600 + minute * 60 + second) * SECRET_KEY; password := MOD(raw_value, 1000000);
-- 转换为6位字符串 Generate_Password := INT_TO_STR(password, 6); END_FUNCTION
-- 主程序 IF RTC_Read_Flag THEN Current_Password := Generate_Password(); -- 将Current_Password发送至HMI显示 END_IF
2. 密码验证程序
ladder
-- 输入密码比较(示例:6位数字) LD X3 -- 输入确认信号 CMP D100 K1 -- 第1位比较 CMP D101 K2 -- 第2位比较 CMP D102 K3 -- 第3位比较 CMP D103 K4 -- 第4位比较 CMP D104 K5 -- 第5位比较 CMP D105 K6 -- 第6位比较 ANDP -- 所有位匹配 OUT Y1 -- 解锁成功 ELSE OUT Y2 -- 解锁失败 END_IF
四、安全性增强措施
密钥管理:
将
SECRET_KEY
存储在PLC的受保护区域(如EEPROM),避免直接暴露。时间窗口限制:
设置密码有效时间(如1分钟),超时后密码失效。
日志记录:
记录密码尝试时间和结果,便于审计。
五、HMI界面设计(示例)
密码输入界面:
6位数字输入框,支持触摸屏输入。
实时时钟显示:
显示当前RTC时间,供用户参考。
状态指示:
绿灯:解锁成功;红灯:解锁失败。
通过上述方法,可实现基于时间变量的动态密码系统,适用于设备授权管理、临时访问控制等场景。实际部署时需根据具体需求调整加密算法和验证逻辑。