-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathFbS7con.SCL
More file actions
222 lines (181 loc) · 7.91 KB
/
Copy pathFbS7con.SCL
File metadata and controls
222 lines (181 loc) · 7.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
FUNCTION_BLOCK "FbS7con"
TITLE = 'Îáìåí äàííûìè ìåæäó äâóìÿ ÏËÊ S7-300(400).'
{ S7_read_back := 'true' ;
S7_blockview := 'big' }
AUTHOR : VA
FAMILY : LIB_PLC
VERSION : '4.4'
VAR_INPUT
Cucle_ms { S7_dynamic := 'true'; S7_link := 'false' } :DINT := 100 ; // GET,PUT Ïåðèîä îáìåíà äàííûìè ìåæäó ÏËÊ 0...10 000 ìñ.
ID { S7_dynamic := 'true'; S7_link := 'false' } :WORD := 1 ; // GET,PUT NetPro ID S7 connection.
RxOn { S7_dynamic := 'true'; S7_link := 'false' } :BOOL := TRUE; // GET Âêëþ÷èòü ïðèåì äàííûõ èç óäàëåííîãî ÏËÊ.
RxDbNumRem { S7_dynamic := 'true'; S7_link := 'false' } :INT := 4 ; // GET Íîìåð DB â óäàëåííîì ÏËÊ.
RxDbAdrRem { S7_dynamic := 'true'; S7_link := 'false' } :DWORD := 0 ; // GET Còàðòîâûé àäðåñ áàéòà âíóòðè DB â óäàëåííîì ÏËÊ.
RxDbNumLoc { S7_dynamic := 'true'; S7_link := 'false' } :INT := 30 ; // GET Íîìåð DB ýòîì ÏËÊ (FbS7conRx).
RxDbAdrLoc { S7_dynamic := 'true'; S7_link := 'false' } :DWORD := 0 ; // GET Còàðòîâûé àäðåñ áàéòà âíóòðè DB â ýòîì ÏËÊ.
RxLen { S7_dynamic := 'true'; S7_link := 'false' } :INT := 64 ; // GET Êîëè÷åñòâî ïðèíèìàåìûõ áàéò â äàòàáëîêå.
TxOn { S7_dynamic := 'true'; S7_link := 'false' } :BOOL := TRUE; // PUT Âêëþ÷èòü ïåðåäà÷ó äàííûõ â óäàëåííûé ÏËÊ.
TxDbNumRem { S7_dynamic := 'true'; S7_link := 'false' } :INT := 3 ; // PUT Íîìåð DB â óäàëåííîì ÏËÊ.
TxDbAdrRem { S7_dynamic := 'true'; S7_link := 'false' } :DWORD := 0 ; // PUT Còàðòîâûé àäðåñ áàéòà âíóòðè DB â óäàëåííîì ÏËÊ.
TxDbNumLoc { S7_dynamic := 'true'; S7_link := 'false' } :INT := 40 ; // PUT Íîìåð DB ýòîì ÏËÊ (FbS7conTx).
TxDbAdrLoc { S7_dynamic := 'true'; S7_link := 'false' } :DWORD := 0 ; // PUT Còàðòîâûé àäðåñ áàéòà âíóòðè DB â ýòîì ÏËÊ.
TxLen { S7_dynamic := 'true'; S7_link := 'false' } :INT := 64 ; // PUT Êîëè÷åñòâî ïåðåäàâàåìûõ áàéò â äàòàáëîêå.
END_VAR
//-----------------------------------------------------------------------
VAR_OUTPUT
RxEr { S7_dynamic := 'true' } :BOOL := FALSE; // Îøèáêà ïðè ïðèåìå äàííûõ èç óäàëåííîãî ÏËÊ.
TxEr { S7_dynamic := 'true' } :BOOL := FALSE; // Îøèáêà ïðè ïåðåäà÷å äàííûõ â óäàëåííûé ÏËÊ.
END_VAR
//-----------------------------------------------------------------------
VAR
DbTON : TON; // Ãåíåðàòîð èìïóëüñîâ çàäàåò òåìï îáìåíà.
DbGET : GET; // SFB14 Ïðèíÿòü äàííûå.
DbPUT : PUT; // SFB15 Îòïðàâèòü äàííûå.
PulseGen : BOOL := FALSE; // Ãåíåðàòîð èìïóëüñîâ çàäàåò òåìï îáìåíà.
END_VAR
//-----------------------------------------------------------------------
VAR_TEMP
GET_ADDR_1 : ANY ;
GET_ADDR_1_st AT GET_ADDR_1 : STRUCT
b0 : BYTE;
b1 : BYTE;
w2 : INT;
w3 : INT;
d4 : DWORD;
END_STRUCT;
GET_RD_1 : ANY ;
GET_RD_1_st AT GET_RD_1 : STRUCT
b0 : BYTE;
b1 : BYTE;
w2 : INT;
w3 : INT;
d4 : DWORD;
END_STRUCT;
PUT_ADDR_1 : ANY ;
PUT_ADDR_1_st AT PUT_ADDR_1 : STRUCT
b0 : BYTE;
b1 : BYTE;
w2 : INT;
w3 : INT;
d4 : DWORD;
END_STRUCT;
PUT_SD_1 : ANY ;
PUT_SD_1_st AT PUT_SD_1 : STRUCT
b0 : BYTE;
b1 : BYTE;
w2 : INT;
w3 : INT;
d4 : DWORD;
END_STRUCT;
GET_REQ :BOOL;
PUT_REQ :BOOL;
END_VAR
//-----------------------------------------------------------------------
BEGIN
// VA 11-04-2023
// Âûçûâàòü Äàííûé FB èç OB1.
// Áëîê ñîììåñòèì ñ CFC PCS7v9.1 íî ïîääåðæèâàåòñÿ íå âñåìè òèïàìè CPU/CP.
// NetPro íåîáõîäèìî ïðîãðóæàòü îòäåëüíî.
// Ïðè èñïîëüçîâàíèè íàäî ñíà÷àëà ñãåíåðèðîâàòü DB äëÿ FbS7conTx, FbS7conRx.
// Ïðèìåð ðàáîòû ñ òèïîì ANY:
// https://web.archive.org/web/20220322171539/http://plc4good.org.ua/view_post.php?id=303
// https://github.com/komatic1/SCL_network_communication/blob/main/S7Put.scl
// https://github.com/komatic1/SCL_network_communication/blob/main/S7Get.scl
//
// Òðè áëîêà ðàáîòàþò ñîâìåñòíî.
// FbS7con FbS7conTx FbS7conRx
IF (Cucle_ms <= 0) THEN
// Äëÿ ìàêñèìàëüíîé ñêîðîñòè îáìåíà óáðàòü SFB4 TON òàéìåð.
PulseGen := NOT(PulseGen);
ELSE
// Ãåíåðàòîð èìïóëüñîâ çàäàåò òåìï îáìåíà.
DbTON.IN := NOT(PulseGen);
DbTON.PT := DINT_TO_TIME(Cucle_ms);
DbTON();
PulseGen := DbTON.Q;
END_IF;
//-----------------------------------------------------------------------
// Àäðåñ è ðàçìåð DB â óäàëåííîì ÏËÊ.
// ADDR_1 := P#DB4.DBX 0.0 BYTE 64;
GET_ADDR_1_st.b0 := B#16#10 ; // Magic Constant.
GET_ADDR_1_st.b1 := B#16#2 ; // Magic Constant.
GET_ADDR_1_st.w2 := RxLen ; // Êîëè÷åñòâî áàéò.
GET_ADDR_1_st.w3 := RxDbNumRem; // Íîìåð DB.
GET_ADDR_1_st.d4 := SHL(IN := RxDbAdrRem, N := 3) OR DW#16#84000000; // Ñòàðòîâûé àäðåñ âíóòðè DB.
// Àäðåñ è ðàçìåð DB ýòîì ÏËÊ (FbS7conRx).
// RD_1 := P#DB30.DBX0.0 BYTE 64;
GET_RD_1_st.b0 := B#16#10 ; // Magic Constant.
GET_RD_1_st.b1 := B#16#2 ; // Magic Constant.
GET_RD_1_st.w2 := RxLen ; // Êîëè÷åñòâî áàéò.
GET_RD_1_st.w3 := RxDbNumLoc; // Íîìåð DB.
GET_RD_1_st.d4 := SHL(IN := RxDbAdrLoc, N := 3) OR DW#16#84000000; // Ñòàðòîâûé àäðåñ âíóòðè DB.
IF(RxOn) THEN
// SFB14 GET Ïðèåì äàííûõ èç óäàëåííîãî ÏËÊ ÷åðåç S7 connection â NetPro.
DbGET(REQ := GET_REQ
,ID := ID
,ADDR_1 := GET_ADDR_1 // Àäðåñ è ðàçìåð DB â óäàëåííîì ÏËÊ.
,RD_1 := GET_RD_1); // Àäðåñ è ðàçìåð DB ýòîì ÏËÊ (FbS7conRx).
// Çàïðîñ íà ïðèåì åñëè ñòàòóñ áëîêà íå çàíÿòî.
GET_REQ := PulseGen AND (DbGET.STATUS <> 25);
END_IF;
// Îøèáêà ïðè ïðèåìå äàííûõ.
RxEr := DbGET.ERROR OR NOT(RxOn);
//-----------------------------------------------------------------------
IF(TxOn) THEN
// Àäðåñ è ðàçìåð DB â óäàëåííîì ÏËÊ.
// ADDR_1 := P#DB3.DBX 0.0 BYTE 64;
PUT_ADDR_1_st.b0 := B#16#10 ; // Magic Constant.
PUT_ADDR_1_st.b1 := B#16#2 ; // Magic Constant.
PUT_ADDR_1_st.w2 := TxLen ; // Êîëè÷åñòâî áàéò.
PUT_ADDR_1_st.w3 := TxDbNumRem; // Íîìåð DB.
PUT_ADDR_1_st.d4 := SHL(IN := TxDbAdrRem, N := 3) OR DW#16#84000000; // Ñòàðòîâûé àäðåñ âíóòðè DB.
// Àäðåñ è ðàçìåð DB ýòîì ÏËÊ (FbS7conTx).
// SD_1 := P#DB40.DBX0.0 BYTE 64;
PUT_SD_1_st.b0 := B#16#10 ; // Magic Constant.
PUT_SD_1_st.b1 := B#16#2 ; // Magic Constant.
PUT_SD_1_st.w2 := TxLen ; // Êîëè÷åñòâî áàéò.
PUT_SD_1_st.w3 := TxDbNumLoc; // Íîìåð DB.
PUT_SD_1_st.d4 := SHL(IN := TxDbAdrLoc, N := 3) OR DW#16#84000000; // Ñòàðòîâûé àäðåñ âíóòðè DB.
// SFB15 PUT Ïåðåäà÷à äàííûõ â óäàëåííûé ÏËÊ ÷åðåç S7 connection â NetPro.
DbPUT(REQ := PUT_REQ
,ID := ID
,ADDR_1 := PUT_ADDR_1 // Àäðåñ è ðàçìåð DB â óäàëåííîì ÏËÊ.
,SD_1 := PUT_SD_1); // Àäðåñ è ðàçìåð DB ýòîì ÏËÊ (FbS7conRx).
// Çàïðîñ íà ïåðåäà÷ó åñëè ñòàòóñ áëîêà íå çàíÿòî.
PUT_REQ := PulseGen AND (DbPUT.STATUS <> 25);
END_IF;
// Îøèáêà ïðè ïåðåäà÷å äàííûõ.
TxEr := DbPUT.ERROR OR NOT(TxOn);
(*
Ïðèìåð âûçîâà íà àññåìáëåðå.
CALL #DbGET (
REQ := L 0.0,
ID := W#16#1,
NDR := #GET_NDR,
ERROR := #GET_ERROR,
STATUS := #GET_STAUS,
ADDR_1 := P#DB4.DBX 0.0 BYTE 64,
RD_1 := P#DB30.DBX0.0 BYTE 64);
CALL #DbPUT (
REQ := L 0.0,
ID := W#16#1,
DONE := #PUT_DONE,
ERROR := #PUT_ERROR,
STATUS := #PUT_STATUS,
ADDR_1 := P#DB3.DBX 0.0 BYTE 64,
SD_1 := P#DB40.DBX0.0 BYTE 64);
*)
// @COPYLEFT ALL WRONGS RESERVED :)
// Author: VA
// Contacts: DIY.PLC.314@gmail.com
// Date start LIB_PLC: 2014
// License: GNU GPL-2.0-or-later
// https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
// https://www.youtube.com/watch?v=n1F_MfLRlX0
// https://www.youtube.com/@DIY_PLC
// https://github.com/DIYPLC/LIB_PLC
// https://oshwlab.com/diy.plc.314/PLC_HW1_SW1
// https://3dtoday.ru/3d-models/mechanical-parts/body/korpus-na-din-reiku
// https://t.me/DIY_PLC
// https://drive.google.com/drive/folders/16GDX0i07rwDrl_oPzL-lQAqMiAz3ouJV?usp=sharing
END_FUNCTION_BLOCK