在工业自动化领域,可编程逻辑控制器(PLC)常被用于控制各种机械设备和过程。对于设备供应商来说,有时会采用分期付款的方式来销售设备,这可能需要在设备的控制系统中实现一种“锁机”功能,以确保只有在收到付款后,设备才能正常运行。
以下是一个基本的概念性描述,用于说明如何使用PLC实现分期付款锁机程序:
-
状态标识符:
-
创建一个内部寄存器或变量(例如,D100),用作锁机状态标识。当此标识为0时,设备解锁并允许运行;当标识为1时,设备锁定,不允许运行。
-
-
用户界面:
-
设计一个简单的用户界面,显示锁机状态,并提供解锁请求按钮。这可以通过触摸屏HMI实现。
-
-
解锁请求处理:
-
当用户按下解锁请求按钮时,PLC应通过网络连接或串行通信向远程服务器发送解锁请求。这可能需要一个与外部系统(如公司的财务系统)集成的接口。
-
-
服务器响应:
-
服务器验证付款状态。如果付款已确认,服务器将向PLC发送解锁命令。
-
-
解锁命令接收:
-
PLC接收到解锁命令后,将状态标识符设置为0,允许设备运行。
-
-
定时器和自动锁机:
-
可以添加一个定时器,如果在一定时间内没有收到新的解锁命令,则自动将状态标识符设为1,重新锁定设备。
-
-
安全考虑:
-
在设计锁机程序时,必须考虑到安全性。例如,防止恶意的解锁尝试,确保通信的安全性等。
-
-
异常处理:
-
需要考虑到网络故障、服务器未响应等情况下的处理机制,以避免设备永久锁定或无法正常工作。
-
本程序当进入锁定状态时,HMI会提示用户输入密码,输入正确才能正常操作原程序。输入的密码要求具有以下几种:能解锁一个月、三个月、六个月、一年、永久性解锁使用时间。
以下程序作为分享 基于信捷PLC的时间设备密码锁 如需要原程序的 私聊即可。
// C语言.h文件
#define set_year DHD[15000] //设置年
#define set_month DHD[15010] //设置月
#define set_day DHD[15020] //设置日
#define set_hour DHD[15030] //设置时
#define set_minute DHD[15040] //设置分
#define set_year_1 DHD[15000] //设置年
#define set_month_1 DHD[15010] //设置月
#define set_day_1 DHD[15020] //设置日
#define set_hour_1 DHD[15030] //设置时
#define set_minute_1 DHD[15040] //设置分
#define set_month_2 DHD[15050]
#define arr_0 HD[10000+50*i_num]
#define arr_1 HD[8000+40*i_num]
#define N 20
#define set_time DHD[16000]
typedef struct
{
int year; //年 4 50 00
int month; //月 4 52 02
int day; //日 4 54 04
int hour; //时 4 6 06
int minute; //分 48 08
int second; //秒 460 10
int week; //星期 462 12
int week_1; //64 14
int countdown; //倒计时年 16
} Time_code;
typedef struct
{
int Dynamic_verification_code_1; //动态验证码1 15000
int Dynamic_verification_code_2; //动态验证码2 15002
int Equipment_code; //设备码 15004
int One_month_password; // 一个月密码6
int Three_month_password; // 三个月密码8
int Six_month_password; // 六个月密码10
int One_year_password; // 一年密码12
int Permanent_password; // 永久密码14
int admin_set_time; //16
int password_val; //返回值18
int admin_time;
} Code_num;
Time_code *Read_Time_code[N]; //读系统当前时间
Code_num *random_Code_num[N]; //动态验证码
int i_num;
for ( i_num = 0; i_num < N; i_num++ )
{
Read_Time_code[i_num] = ( Time_code * ) ( &arr_0 );
random_Code_num[i_num] = ( Code_num * ) ( &arr_1 );
}
void week_num ( int i, int y ) //星期日返回值
{
#define SysRegAddr_D_HD_HM_FS_HSD_HSCD_SD_SFD_SM_M_HCD_HTD_T
switch ( i )
{
case 0:
Read_Time_code[y]->week_1 = -1599 ;
break;
case 1:
Read_Time_code[y]->week_1 = -10808;
break;
case 2:
Read_Time_code[y]->week_1 = -17454;
break;
case 3:
Read_Time_code[y]->week_1 = -330;
break;
case 4:
Read_Time_code[y]->week_1 = -568;
break;
case 5:
Read_Time_code[y]->week_1 = -15157;
break;
case 6:
Read_Time_code[y]->week_1 = -6706;
break;
}
}
void Monthly_calculation ( int num, int i )
{
#define SysRegAddr_D_HD_HM_FS_HSD_HSCD_SD_SFD_SM_M_HCD_HTD_T
switch ( num ) //月的累加 润年步润年
{
case 0 :
if ( Read_Time_code[i]->day > 31 ) // 1 3 5 7 8 10 12
{
Read_Time_code[i]->month = Read_Time_code[i]->month + 1;
Read_Time_code[i]->day = Read_Time_code[i]->day - 31;
}
break;
case 1 :
if ( Read_Time_code[i]->day > 30 ) // 4 6 9 11
{
Read_Time_code[i]->month = Read_Time_code[i]->month + 1;
Read_Time_code[i]->day = Read_Time_code[i]->day - 30;
}
break;
case 2:
if ( Read_Time_code[i]->day > 29 ) // 2
{
Read_Time_code[i]->month = Read_Time_code[i]->month + 1;
Read_Time_code[i]->day = Read_Time_code[i]->day - 29;
}
break;
case 3:
if ( Read_Time_code[i]->day > 28 ) // 2
{
Read_Time_code[i]->month = Read_Time_code[i]->month + 1;
Read_Time_code[i]->day = Read_Time_code[i]->day - 28;
}
break;
}
}
int Calculate_the_week ( int i ) //计算星期
{
#define SysRegAddr_D_HD_HM_FS_HSD_HSCD_SD_SFD_SM_M_HCD_HTD_T
int y = ( ( 13 * ( Read_Time_code[i]->month + 1 ) / 5 )
+ Read_Time_code[i]->day + (Read_Time_code[i]->year%100)
+ ( (Read_Time_code[i]->year%100) / 4 ) + ( (Read_Time_code[i]->year/100) / 4 ) -(2 *(Read_Time_code[i]->year/100)) ) % 7;
return y;
}
int Monthly_calculation_1 ( int i )
{
#define SysRegAddr_D_HD_HM_FS_HSD_HSCD_SD_SFD_SM_M_HCD_HTD_T
int month_num;
if ( Read_Time_code[i]->month != 2
&& ( Read_Time_code[i]->month == 1
|| Read_Time_code[i]->month == 3
|| Read_Time_code[i]->month == 5
|| Read_Time_code[i]->month == 7
|| Read_Time_code[i]->month == 8
|| Read_Time_code[i]->month == 10
|| Read_Time_code[i]->month == 12
) )
{
month_num = 0; //31天
if ( set_day > 31 )
{
set_day = 0;
set_month = set_month + 1;
}
}
if ( Read_Time_code[i]->month != 2
&& ( Read_Time_code[i]->month == 4
|| Read_Time_code[i]->month == 6
|| Read_Time_code[i]->month == 9
|| Read_Time_code[i]->month == 11
) )
{
month_num = 1; //30天
if ( set_day > 30 )
{
set_day = 0;
set_month = set_month + 1;
}
}
else if ( Read_Time_code[i]->month == 2 ) //判断闰年
{
int remainder, remainder_1, remainder_2; // 局部变量余数
remainder = Read_Time_code[i]->year % 400;
remainder_1 = Read_Time_code[i]->year % 4 ;
remainder_2 = Read_Time_code[i]->year % 100 ;
if ( remainder == 0 || ( remainder_1 == 0 && remainder_2 != 0 ) )
{
month_num = 2;
if ( set_day > 29 )
{
set_day = 29;
}
}
else
{
month_num = 3;
if ( set_day > 28 )
{
set_day = 28;
}
}
}
return month_num;
}
-