PLC分期付款锁机程序(需要源码私聊即可)

在工业自动化领域,可编程逻辑控制器(PLC)常被用于控制各种机械设备和过程。对于设备供应商来说,有时会采用分期付款的方式来销售设备,这可能需要在设备的控制系统中实现一种“锁机”功能,以确保只有在收到付款后,设备才能正常运行。

以下是一个基本的概念性描述,用于说明如何使用PLC实现分期付款锁机程序:

  1. 状态标识符:

    • 创建一个内部寄存器或变量(例如,D100),用作锁机状态标识。当此标识为0时,设备解锁并允许运行;当标识为1时,设备锁定,不允许运行。

  2. 用户界面:

    • 设计一个简单的用户界面,显示锁机状态,并提供解锁请求按钮。这可以通过触摸屏HMI实现。

  3. 解锁请求处理:

    • 当用户按下解锁请求按钮时,PLC应通过网络连接或串行通信向远程服务器发送解锁请求。这可能需要一个与外部系统(如公司的财务系统)集成的接口。

  4. 服务器响应:

    • 服务器验证付款状态。如果付款已确认,服务器将向PLC发送解锁命令。

  5. 解锁命令接收:

    • PLC接收到解锁命令后,将状态标识符设置为0,允许设备运行。

  6. 定时器和自动锁机:

    • 可以添加一个定时器,如果在一定时间内没有收到新的解锁命令,则自动将状态标识符设为1,重新锁定设备。

  7. 安全考虑:

    • 在设计锁机程序时,必须考虑到安全性。例如,防止恶意的解锁尝试,确保通信的安全性等。

  8. 异常处理:

    • 需要考虑到网络故障、服务器未响应等情况下的处理机制,以避免设备永久锁定或无法正常工作。

    • 本程序当进入锁定状态时,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;

      }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王同学玩工控

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值