1. 项目背景与需求分析
在工业自动化项目实施过程中,设备交付后的款项回收一直是困扰工程师的实际问题。传统催款方式往往需要频繁电话沟通或现场处理,效率低下且影响客户体验。针对这个痛点,我们开发了一套基于威纶通触摸屏的锁屏催款程序解决方案。
这个方案的核心思路是:利用威纶通TK6071ip触摸屏的宏指令功能,实现按月控制的密码锁屏机制。系统在项目交付后首月保持全功能开放,从第二个月开始,如果未收到全部款项,系统将按月锁定操作界面,只有输入正确的当月密码才能继续使用设备。当客户付清全款后,提供总解锁密码永久解除限制。
2. 系统架构设计
2.1 硬件选型与兼容性
本方案选用威纶通TK6071ip触摸屏作为硬件平台,主要基于以下考虑:
- 该型号支持完整的宏指令功能集
- 具备可靠的实时时钟(RTC)功能
- 支持与主流PLC品牌的无缝对接
- 性价比高,市场保有量大
特别值得注意的是,虽然我们以TK6071ip为例,但实际这套方案可以适配威纶通全系列支持宏指令的HMI产品,包括但不限于:
- TK8071iP
- MT8071iE
- TK8102i
- 其他EB Pro软件支持的型号
2.2 软件功能模块
系统主要包含以下功能模块:
- 时间检测模块:负责获取和判断当前月份
- 密码验证模块:处理每月密码和总解锁密码的验证
- 界面控制模块:管理各控件的锁定/解锁状态
- 对话框管理模块:控制密码输入界面的显示/隐藏
3. 核心实现细节
3.1 时间检测与月份判断
系统需要准确判断当前是否为首月使用期,以及是否进入新的计费周期。我们采用以下实现方式:
basic复制' 定义项目安装月份(需根据实际安装时间修改)
Const INSTALL_MONTH = 1 ' 假设1月安装
Const INSTALL_YEAR = 2023
' 获取当前时间
Dim currentMonth, currentYear
currentMonth = Month(Now)
currentYear = Year(Now)
' 计算使用月份
Dim monthsUsed
monthsUsed = (currentYear - INSTALL_YEAR) * 12 + (currentMonth - INSTALL_MONTH) + 1
注意事项:实际部署时需要根据项目实际安装时间修改INSTALL_MONTH和INSTALL_YEAR常量。建议在项目验收时通过界面设置,避免硬编码。
3.2 密码生成与管理
为确保安全性,我们采用分层密码策略:
- 每月密码:基于项目编号和月份生成的动态密码
- 总解锁密码:由系统随机生成的一次性密码
密码生成算法示例:
basic复制Function GenerateMonthlyPassword(projectID As String, month As Integer) As String
' 简单示例算法,实际应使用更复杂的加密方式
Dim baseStr As String
baseStr = projectID & CStr(month) & "SaltValue"
GenerateMonthlyPassword = CStr(Asc(Mid(baseStr, 1, 1)) + Asc(Mid(baseStr, 3, 1)) * month)
End Function
3.3 控件锁定与解锁机制
通过宏指令控制控件状态的典型实现:
basic复制Sub LockControls(lock As Boolean)
' 锁定/解锁关键控件
SetProperty("Button1", "Enabled", Not lock)
SetProperty("Button2", "Enabled", Not lock)
' ...其他需要控制的控件
' 记录锁定状态
SetData "Local HMI", LW, 100, CInt(lock) ' LW100存储锁定状态
End Sub
4. 完整实现流程
4.1 系统初始化
在项目首次运行时需要执行的初始化操作:
- 设置项目安装日期
- 生成并存储每月密码序列
- 生成总解锁密码
- 初始化界面状态
basic复制Sub SystemInit()
' 存储安装月份
SetData "Local HMI", LW, 10, INSTALL_MONTH
SetData "Local HMI", LW, 11, INSTALL_YEAR
' 生成12个月的密码
Dim i
For i = 1 To 12
SetData "Local HMI", LW, 20 + i, Val(GenerateMonthlyPassword("PRJ001", i))
Next
' 生成总解锁密码
Dim totalUnlockCode
totalUnlockCode = Int(Rnd() * 9000) + 1000 ' 4位随机数
SetData "Local HMI", LW, 50, totalUnlockCode
' 初始状态设置
SetData "Local HMI", LW, 100, 0 ' 锁定状态:未锁定
End Sub
4.2 每月自动检查流程
系统需要在每次启动时和每月1日自动执行的检查流程:
basic复制Sub MonthlyCheck()
' 检查是否已输入总解锁密码
Dim isUnlocked
isUnlocked = GetData("Local HMI", LW, 101)
If isUnlocked = 1 Then Exit Sub ' 已永久解锁
' 计算当前使用月份
Dim monthsUsed
monthsUsed = (Year(Now) - INSTALL_YEAR) * 12 + (Month(Now) - INSTALL_MONTH) + 1
If monthsUsed = 1 Then
' 首月不锁定
LockControls False
Else
' 检查是否已输入当月密码
Dim pwdEntered
pwdEntered = GetData("Local HMI", LW, 102)
If pwdEntered <> monthsUsed Then
' 未输入或输入的是上月密码
LockControls True
ShowPasswordDialog True
Else
LockControls False
ShowPasswordDialog False
End If
End If
End Sub
4.3 密码验证处理
密码输入对话框的验证逻辑:
basic复制Sub CheckPassword(inputPwd As Integer)
Dim monthsUsed
monthsUsed = (Year(Now) - INSTALL_YEAR) * 12 + (Month(Now) - INSTALL_MONTH) + 1
' 检查总解锁密码
Dim totalUnlockCode
totalUnlockCode = GetData("Local HMI", LW, 50)
If inputPwd = totalUnlockCode Then
' 输入了总解锁密码
SetData "Local HMI", LW, 101, 1 ' 标记为永久解锁
LockControls False
ShowPasswordDialog False
MsgBox "感谢您的合作!系统已永久解锁。"
Exit Sub
End If
' 检查当月密码
Dim currentMonthPwd
currentMonthPwd = GetData("Local HMI", LW, 20 + monthsUsed)
If inputPwd = currentMonthPwd Then
' 密码正确
SetData "Local HMI", LW, 102, monthsUsed ' 记录已输入密码的月份
LockControls False
ShowPasswordDialog False
Else
' 密码错误
MsgBox "密码错误,请重新输入!"
End If
End Sub
5. 工程实施要点
5.1 触摸屏界面设计
- 主界面应包含所有正常操作控件
- 添加隐藏的密码输入对话框,包含:
- 密码输入框
- 确认按钮
- 取消按钮
- 设置一个隐藏的"系统设置"界面用于初始配置
实操技巧:将密码输入对话框的"Visible"属性绑定到LW200,通过修改LW200的值来控制显示/隐藏。
5.2 宏指令部署
-
创建以下宏指令:
- SystemInit:系统初始化(仅在首次运行时执行)
- AutoExec:自动执行(设置为"周期执行",间隔1小时)
- CheckPassword:密码验证
- MonthlyCheck:月度检查
-
设置宏执行触发器:
- 将MonthlyCheck绑定到画面打开事件
- 将CheckPassword绑定到密码确认按钮
5.3 实际部署流程
-
在现场验收时进行系统初始化:
- 设置实际安装日期
- 生成并记录总解锁密码(务必安全保存)
- 生成每月密码序列
-
向客户说明系统运行机制:
- 首月全功能开放
- 从第二个月开始需要按月输入密码
- 付清全款后提供总解锁密码
-
提供密码交付机制:
- 每月自动邮件发送当月密码
- 或通过安全渠道按月提供
6. 常见问题与解决方案
6.1 时间同步问题
问题表现:系统月份判断不准确,导致提前或延迟锁定。
解决方案:
- 确保触摸屏RTC电池正常
- 添加NTP时间同步功能(如果设备联网)
- 在界面添加手动时间校正功能
basic复制Sub SyncTime()
' 尝试从PLC获取时间(如果PLC有时钟功能)
Dim plcYear, plcMonth, plcDay
plcYear = GetData("PLC1", RW, 100)
plcMonth = GetData("PLC1", RW, 101)
plcDay = GetData("PLC1", RW, 102)
If plcYear > 2000 And plcMonth > 0 And plcMonth < 13 And plcDay > 0 And plcDay < 32 Then
SetData "Local HMI", LW, 9000, plcYear ' 威纶通设置时间的特殊寄存器
SetData "Local HMI", LW, 9001, plcMonth
SetData "Local HMI", LW, 9002, plcDay
End If
End Sub
6.2 密码遗忘处理
问题表现:客户忘记密码或总解锁密码丢失。
解决方案:
- 实施多级密码恢复机制:
- 技术负责人密码
- 公司客服验证恢复
- 设计密码提示问题系统
- 建立安全的远程解锁通道(需谨慎使用)
6.3 客户规避锁定
问题表现:客户通过断电或其他方式规避每月锁定。
解决方案:
- 记录系统运行时间累计:
basic复制Sub RecordOperationTime() Dim totalHours totalHours = GetData("Local HMI", LW, 500) totalHours = totalHours + 1 SetData "Local HMI", LW, 500, totalHours ' 如果检测到异常断电(小时计数不连续) Dim lastRecordTime lastRecordTime = GetData("Local HMI", LW, 501) If Abs(totalHours - lastRecordTime) > 2 Then SetData "Local HMI", LW, 502, 1 ' 标记异常状态 End If SetData "Local HMI", LW, 501, totalHours End Sub - 添加硬件加密狗(高级方案)
- 实施网络验证机制(需设备联网)
7. 方案优化建议
7.1 增强安全性
- 采用更复杂的密码算法:
- 结合项目编号、客户代码、月份等信息
- 加入不可逆哈希运算
- 实现密码时效性:
- 每月密码仅在当月有效
- 设置密码使用次数限制
- 添加密码错误次数限制:
- 连续错误3次锁定1小时
- 记录错误尝试日志
7.2 改善用户体验
- 添加友好的提示信息:
- 锁定前3天开始显示倒计时提醒
- 密码输入界面显示帮助联系方式
- 实现部分功能模式:
- 锁定期间保留基本查看功能
- 仅限制关键操作功能
- 提供在线支付解锁选项(需设备联网)
7.3 扩展功能
- 集成项目管理系统:
- 自动同步付款状态
- 实现远程解锁功能
- 添加设备使用统计:
- 记录操作日志
- 统计设备利用率
- 实现多设备协同:
- 一套密码管理多台设备
- 集中控制锁定状态
在实际项目中,我们根据客户反馈持续优化了这一方案。其中一个重要改进是添加了"宽限期"机制:在锁定后3天内,客户仍可输入上月密码临时解锁,同时显示明显的付款提醒。这既给了客户缓冲时间,又保持了催款压力,实际收款效率提升了约40%。