-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsnap7.go
312 lines (264 loc) · 10.5 KB
/
snap7.go
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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
// Copyright 2014 Quoc-Viet Nguyen. All rights reserved.
// This software may be modified and distributed under the terms
// of the BSD license. See the LICENSE file for details.
package snap7
// #cgo CFLAGS: -I ./
// #cgo LDFLAGS: -L . -lsnap7 -lstdc++
// #include "snap7.h"
import "C"
import (
"fmt"
"unsafe"
)
// S7Object S7API Cli_Create();
func Cli_Create() C.S7Object {
return C.Cli_Create()
}
// void S7API Cli_Destroy(S7Object *Client);
func (Client C.S7Object) Cli_Destroy() {
C.Cli_Destroy(&Client)
}
// int S7API Cli_ConnectTo(S7Object Client, const char *Address, int Rack, int Slot);
func (Client C.S7Object) Cli_ConnectTo(addr string, Rack, Slot int) {
C.Cli_ConnectTo(Client, C.CString(addr), C.int(Rack), C.int(Slot))
}
// int S7API Cli_SetConnectionParams(S7Object Client, const char *Address, word LocalTSAP, word RemoteTSAP);
func (Client C.S7Object) Cli_SetConnectionParams(addr string, LocalTSAP, RemoteTSAP uint16) {
C.Cli_SetConnectionParams(Client, C.CString(addr), C.uint16_t(LocalTSAP), C.uint16_t(RemoteTSAP))
}
// int S7API Cli_SetConnectionType(S7Object Client, word ConnectionType);
func (Client C.S7Object) Cli_SetConnectionType(addr string, ConnectionType uint16) {
C.Cli_SetConnectionType(Client, C.uint16_t(ConnectionType))
}
// int S7API Cli_Connect(S7Object Client);
func (Client C.S7Object) Cli_Connect() {
C.Cli_Connect(Client)
}
// int S7API Cli_Disconnect(S7Object Client);
func (Client C.S7Object) Cli_Disconnect() {
C.Cli_Disconnect(Client)
}
// int S7API Cli_GetParam(S7Object Client, int ParamNumber, void *pValue);
func (Client C.S7Object) Cli_GetParam(ParamNumber int) [2048]byte {
var data [2048]byte
ParamData := unsafe.Pointer(&data)
C.Cli_GetParam(Client, C.int(ParamNumber), ParamData)
return data
}
// int S7API Cli_SetParam(S7Object Client, int ParamNumber, void *pValue);
func (Client C.S7Object) Cli_SetParam(ParamNumber int, pwr []byte) {
ParamData := unsafe.Pointer(&pwr)
C.Cli_SetParam(Client, C.int(ParamNumber), ParamData)
}
// int S7API Cli_SetAsCallback(S7Object Client, pfn_CliCompletion pCompletion, void *usrPtr);
// Data I/O main functions
// int S7API Cli_ReadArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
// int S7API Cli_WriteArea(S7Object Client, int Area, int DBNumber, int Start, int Amount, int WordLen, void *pUsrData);
// int S7API Cli_ReadMultiVars(S7Object Client, PS7DataItem Item, int ItemsCount);
// int S7API Cli_WriteMultiVars(S7Object Client, PS7DataItem Item, int ItemsCount);
// Data I/O Lean functions
// int S7API Cli_DBRead(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData);
func (Client C.S7Object) Cli_DBRead(DBNumber, Start, Size int) []byte {
var data [2048]byte
pUsrData := unsafe.Pointer(&data)
C.Cli_DBRead(Client, C.int(DBNumber), C.int(Start), C.int(Size), pUsrData)
return data[0:Size]
}
// int S7API Cli_DBWrite(S7Object Client, int DBNumber, int Start, int Size, void *pUsrData);
func (Client C.S7Object) Cli_DBWrite(DBNumber, Start, Size int, wr []byte) {
var wdata [2048]byte
for i := 0; i < int(Size); i++ {
wdata[i] = wr[i]
}
pUsrData := unsafe.Pointer(&wdata)
C.Cli_DBWrite(Client, C.int(DBNumber), C.int(Start), C.int(Size), pUsrData)
}
// int S7API Cli_MBRead(S7Object Client, int Start, int Size, void *pUsrData);
func (Client C.S7Object) Cli_MBRead(Start, Size int) []byte {
var data [2048]byte
pUsrData := unsafe.Pointer(&data)
C.Cli_MBRead(Client, C.int(Start), C.int(Size), pUsrData)
return data[0:Size]
}
// int S7API Cli_MBWrite(S7Object Client, int Start, int Size, void *pUsrData);
func (Client C.S7Object) Cli_MBWrite(Start, Size int, wr []byte) {
var wdata [2048]byte
for i := 0; i < int(Size); i++ {
wdata[i] = wr[i]
}
pUsrData := unsafe.Pointer(&wdata)
C.Cli_MBWrite(Client, C.int(Start), C.int(Size), pUsrData)
}
// int S7API Cli_EBRead(S7Object Client, int Start, int Size, void *pUsrData);
func (Client C.S7Object) Cli_EBRead(Start, Size int) []byte {
var data [2048]byte
pUsrData := unsafe.Pointer(&data)
C.Cli_EBRead(Client, C.int(Start), C.int(Size), pUsrData)
return data[0:Size]
}
// int S7API Cli_EBWrite(S7Object Client, int Start, int Size, void *pUsrData);
func (Client C.S7Object) Cli_EBWrite(Start, Size int, wr []byte) {
var wdata [2048]byte
for i := 0; i < int(Size); i++ {
wdata[i] = wr[i]
}
pUsrData := unsafe.Pointer(&wdata)
C.Cli_EBWrite(Client, C.int(Start), C.int(Size), pUsrData)
}
// int S7API Cli_ABRead(S7Object Client, int Start, int Size, void *pUsrData);
func (Client C.S7Object) Cli_ABRead(Start, Size int) []byte {
var data [2048]byte
pUsrData := unsafe.Pointer(&data)
C.Cli_ABRead(Client, C.int(Start), C.int(Size), pUsrData)
return data[0:Size]
}
// int S7API Cli_ABWrite(S7Object Client, int Start, int Size, void *pUsrData);
func (Client C.S7Object) Cli_ABWrite(Start, Size int, wr []byte) {
var wdata [2048]byte
for i := 0; i < int(Size); i++ {
wdata[i] = wr[i]
}
pUsrData := unsafe.Pointer(&wdata)
C.Cli_ABWrite(Client, C.int(Start), C.int(Size), pUsrData)
}
// int S7API Cli_TMRead(S7Object Client, int Start, int Amount, void *pUsrData);
func (Client C.S7Object) Cli_TMRead(Start, Amount int) []byte {
var data [2048]byte
pUsrData := unsafe.Pointer(&data)
C.Cli_TMRead(Client, C.int(Start), C.int(Amount), pUsrData)
return data[0:Amount]
}
// int S7API Cli_TMWrite(S7Object Client, int Start, int Amount, void *pUsrData);
func (Client C.S7Object) Cli_TMWrite(Start, Amount int, wr []byte) {
var wdata [2048]byte
for i := 0; i < int(Amount); i++ {
wdata[i] = wr[i]
}
pUsrData := unsafe.Pointer(&wdata)
C.Cli_TMWrite(Client, C.int(Start), C.int(Amount), pUsrData)
}
// int S7API Cli_CTRead(S7Object Client, int Start, int Amount, void *pUsrData);
func (Client C.S7Object) Cli_CTRead(Start, Amount int) []byte {
var data [2048]byte
pUsrData := unsafe.Pointer(&data)
C.Cli_CTRead(Client, C.int(Start), C.int(Amount), pUsrData)
return data[0:Amount]
}
// int S7API Cli_CTWrite(S7Object Client, int Start, int Amount, void *pUsrData);
func (Client C.S7Object) Cli_CTWrite(Start, Amount int, wr []byte) {
var wdata [2048]byte
for i := 0; i < int(Amount); i++ {
wdata[i] = wr[i]
}
pUsrData := unsafe.Pointer(&wdata)
C.Cli_CTWrite(Client, C.int(Start), C.int(Amount), pUsrData)
}
// Directory functions
// int S7API Cli_ListBlocks(S7Object Client, TS7BlocksList *pUsrData);
// int S7API Cli_GetAgBlockInfo(S7Object Client, int BlockType, int BlockNum, TS7BlockInfo *pUsrData);
// int S7API Cli_GetPgBlockInfo(S7Object Client, void *pBlock, TS7BlockInfo *pUsrData, int Size);
// int S7API Cli_ListBlocksOfType(S7Object Client, int BlockType, TS7BlocksOfType *pUsrData, int *ItemsCount);
// Blocks functions
// int S7API Cli_Upload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size);
// int S7API Cli_FullUpload(S7Object Client, int BlockType, int BlockNum, void *pUsrData, int *Size);
// int S7API Cli_Download(S7Object Client, int BlockNum, void *pUsrData, int Size);
// int S7API Cli_Delete(S7Object Client, int BlockType, int BlockNum);
// int S7API Cli_DBGet(S7Object Client, int DBNumber, void *pUsrData, int *Size);
// int S7API Cli_DBFill(S7Object Client, int DBNumber, int FillChar);
// Date/Time functions
// int S7API Cli_GetPlcDateTime(S7Object Client, tm *DateTime);
// int S7API Cli_SetPlcDateTime(S7Object Client, tm *DateTime);
// int S7API Cli_SetPlcSystemDateTime(S7Object Client);
// System Info functions
// int S7API Cli_GetOrderCode(S7Object Client, TS7OrderCode *pUsrData);
// int S7API Cli_GetCpuInfo(S7Object Client, TS7CpuInfo *pUsrData);
type CpuInfo struct {
ModuleTypeName string
SerialNumber string
ASName string
Copyright string
ModuleName string
}
func (Client C.S7Object) Cli_GetCpuInfo() CpuInfo {
var Info C.TS7CpuInfo
var ret CpuInfo
C.Cli_GetCpuInfo(Client, &Info)
// if (Check(res,"Unit Info"))
type cpuInfo struct {
ModuleTypeName [33]byte
SerialNumber [25]byte
ASName [25]byte
Copyright [27]byte
ModuleName [25]byte
}
info := (*cpuInfo)(unsafe.Pointer(&Info))
var str []byte
for _, v := range info.ModuleTypeName {
str = append(str, v)
}
ret.ModuleTypeName = string(str)
str = []byte{}
for _, v := range info.SerialNumber {
str = append(str, v)
}
ret.SerialNumber = string(str)
str = []byte{}
for _, v := range info.Copyright {
str = append(str, v)
}
ret.Copyright = string(str)
str = []byte{}
for _, v := range info.ASName {
str = append(str, v)
}
ret.ASName = string(str)
str = []byte{}
for _, v := range info.ModuleName {
str = append(str, v)
}
ret.ModuleName = string(str)
str = []byte{}
fmt.Println(" Module Type Name :", ret.ModuleTypeName)
fmt.Println(" Seriel Number :", ret.SerialNumber)
fmt.Println(" Copyright :", ret.Copyright)
fmt.Println(" AS Name :", ret.ASName)
fmt.Println(" Module Name :", ret.ModuleName)
return ret
}
// int S7API Cli_GetCpInfo(S7Object Client, TS7CpInfo *pUsrData);
func (Client C.S7Object) Cli_GetCpInfo() (Info C.TS7CpInfo) {
// var Info C.TS7CpInfo
C.Cli_GetCpInfo(Client, &Info)
fmt.Printf(" Max PDU Length : %d bytes\n", Info.MaxPduLengt)
fmt.Printf(" Max Connections : %d \n", Info.MaxConnections)
fmt.Printf(" Max MPI Rate : %d bps\n", Info.MaxMpiRate)
fmt.Printf(" Max Bus Rate : %d bps\n", Info.MaxBusRate)
return
}
// int S7API Cli_ReadSZL(S7Object Client, int ID, int Index, TS7SZL *pUsrData, int *Size);
// int S7API Cli_ReadSZLList(S7Object Client, TS7SZLList *pUsrData, int *ItemsCount);
// Control functions
// int S7API Cli_PlcHotStart(S7Object Client);
// int S7API Cli_PlcColdStart(S7Object Client);
// int S7API Cli_PlcStop(S7Object Client);
// int S7API Cli_CopyRamToRom(S7Object Client, int Timeout);
// int S7API Cli_Compress(S7Object Client, int Timeout);
// int S7API Cli_GetPlcStatus(S7Object Client, int *Status);
// Security functions
// int S7API Cli_GetProtection(S7Object Client, TS7Protection *pUsrData);
// int S7API Cli_SetSessionPassword(S7Object Client, char *Password);
// int S7API Cli_ClearSessionPassword(S7Object Client);
// Low level
// int S7API Cli_IsoExchangeBuffer(S7Object Client, void *pUsrData, int *Size);
// Misc
// int S7API Cli_GetExecTime(S7Object Client, int *Time);
func (Client C.S7Object) Cli_GetExecTime() int32 {
var time C.int
C.Cli_GetExecTime(Client, &time)
return (int32)(time)
}
// int S7API Cli_GetLastError(S7Object Client, int *LastError);
// int S7API Cli_GetPduLength(S7Object Client, int *Requested, int *Negotiated);
// int S7API Cli_ErrorText(int Error, char *Text, int TextLen);
// 1.1.0
// int S7API Cli_GetConnected(S7Object Client, int *Connected);