Diff of /trunk/mcp3008/Libraries/SPI_MCP3008.library.md [000000] .. [r1]  Maximize  Restore

Switch to unified view

a b/trunk/mcp3008/Libraries/SPI_MCP3008.library.md
1
<?xml version="1.0" encoding="utf-8"?>---
2
3
~~~ST
4
FUNCTION_BLOCK IoDrvMCP3008 EXTENDS IoDrvBase
5
VAR
6
    _IIoDrv: ICmpIoDrv;
7
    _IIoDrvParameter: ICmpIoDrvParameter;
8
    _MCP3008: MCP3008;
9
    _dwInUse: DWORD;
10
    _xBackGroundDiagStarted: BOOL;
11
    _bDeactivated: BOOL;
12
END_VAR
13
VAR
14
    CLASSID_CCmpIoDrvTemplate: DWORD;
15
END_VAR
16
17
~~~
18
~~~ST
19
20
~~~
21
---
22
~~~ST
23
METHOD FB_Exit: BOOL
24
VAR_INPUT
25
    bInCopyCode: BOOL;
26
END_VAR
27
28
~~~
29
~~~ST
30
FB_Exit_Count := FB_Exit_Count + 1;
31
FB_Exit := TRUE;
32
~~~
33
---
34
~~~ST
35
METHOD FB_Init: BOOL
36
VAR_INPUT
37
    bInitRetains: BOOL;
38
    bInCopyCode: BOOL;
39
END_VAR
40
VAR
41
    Result: UDINT;
42
END_VAR
43
44
~~~
45
~~~ST
46
FB_Init_Count := FB_Init_Count + 1;
47
48
m_Info.szDriverName := 'IoDrvMCP3008';
49
m_Info.szVendorName := 'Open Source';
50
m_info.szDeviceName := 'MCP3008';
51
m_Info.wModuleType := 8000;
52
53
_IIoDrv := THIS^;
54
_IIoDrvParameter := THIS^;
55
56
m_IBaseItf := THIS^;
57
m_hInterface := IoMgrRegisterInstance2(dwClassId:=CLASSID_CCmpIoDrvTemplate, pItf:=m_IBaseItf, pResult:=ADR(Result));
58
FB_Init := TRUE;
59
~~~
60
---
61
~~~ST
62
METHOD FB_Reinit: BOOL
63
64
~~~
65
~~~ST
66
FB_Reinit_Count := FB_Reinit_Count + 1;
67
FB_Reinit := TRUE;
68
~~~
69
---
70
~~~ST
71
METHOD Initialize: UDINT
72
VAR_INPUT
73
    wModuleType: UINT;
74
    dwInstance: UDINT;
75
    pConnector: pointer;
76
END_VAR
77
78
~~~
79
~~~ST
80
Initialize_Count := Initialize_Count + 1;
81
82
m_wModuleType := wModuleType;
83
m_dwInstance := dwInstance;
84
m_Info.wModuleType := wModuleType;
85
86
_MCP3008.Initialize(wModuleType, dwInstance, pConnector);
87
88
Initialize := CmpErrors.Errors.ERR_OK;
89
~~~
90
---
91
~~~ST
92
METHOD QueryInterface: pointer
93
VAR_INPUT
94
    iid: DWORD;
95
    pResult: pointer;
96
END_VAR
97
98
~~~
99
~~~ST
100
QueryInterface_Count := QueryInterface_Count + 1;
101
IF iid = ITFID_ICmpIoDrv THEN
102
    QueryInterface := ADR(_IIoDrv);
103
    AddRef();
104
    IF (pResult &lt;&gt; 0) THEN
105
        pResult^ := Errors.ERR_OK;
106
    END_IF
107
    RETURN; 
108
ELSIF iid = ITFID_ICmpIoDrvParameter THEN
109
    QueryInterface := ADR(_IIoDrvParameter);
110
    AddRef();
111
    IF (pResult &lt;&gt; 0) THEN
112
        pResult^ := Errors.ERR_OK;
113
    END_IF  
114
    RETURN; 
115
ELSE
116
    QueryInterface := SUPER^.QueryInterface(iid, pResult);
117
END_IF
118
119
~~~
120
---
121
~~~ST
122
METHOD IoDrvGetModuleDiagnosis: UDINT
123
VAR_INPUT
124
    pConnector: pointer;
125
END_VAR
126
127
~~~
128
~~~ST
129
IF pConnector = 0 THEN
130
    //we are called from the background task
131
    _xBackGroundDiagStarted := TRUE;
132
END_IF
133
134
IoDrvGetModuleDiagnosis_Count := IoDrvGetModuleDiagnosis_Count + 1;
135
IoDrvGetModuleDiagnosis := Errors.ERR_NOTIMPLEMENTED;
136
~~~
137
---
138
~~~ST
139
METHOD IoDrvIdentify: UDINT
140
VAR_INPUT
141
    pConnector: pointer;
142
END_VAR
143
144
~~~
145
~~~ST
146
IoDrvIdentify_Count := IoDrvIdentify_Count + 1;
147
IoDrvIdentify := Errors.ERR_NOTIMPLEMENTED;
148
~~~
149
---
150
~~~ST
151
METHOD IoDrvReadInputs: UDINT
152
VAR_INPUT
153
    pConnectorMapList: pointer;
154
    nCount: DINT;
155
END_VAR
156
VAR
157
    i: DINT;
158
    j: DINT;
159
END_VAR
160
161
~~~
162
~~~ST
163
IoDrvReadInputs_Count := IoDrvReadInputs_Count + 1;
164
165
IF pConnectorMapList = 0 OR nCount = 0 THEN
166
    IoDrvReadInputs := Errors.ERR_PARAMETER;
167
    RETURN;
168
END_IF
169
170
FOR i:=0 TO nCount - 1 DO
171
    IF (pConnectorMapList[i].dwNumOfChannels = 0) THEN
172
        CONTINUE;
173
    END_IF
174
    FOR j:= 0 TO UDINT_TO_UINT(pConnectorMapList[i].dwNumOfChannels) - 1 DO 
175
        IoMgrCopyInputLE(ADR(pConnectorMapList[i].pChannelMapList[j]), pConnectorMapList[i].pChannelMapList[j].pParameter^.dwDriverSpecific);
176
    END_FOR
177
END_FOR
178
179
IoDrvReadInputs := Errors.ERR_OK;
180
~~~
181
---
182
~~~ST
183
METHOD IoDrvScanModules: UDINT
184
VAR_INPUT
185
    pConnector: pointer;
186
    ppConnectorList: pointer;
187
    pnCount: pointer;
188
END_VAR
189
190
~~~
191
~~~ST
192
IoDrvScanModules_Count := IoDrvScanModules_Count + 1;
193
IoDrvScanModules := Errors.ERR_NOTIMPLEMENTED;
194
~~~
195
---
196
~~~ST
197
METHOD IoDrvStartBusCycle: UDINT
198
VAR_INPUT
199
    pConnector: pointer;
200
END_VAR
201
202
~~~
203
~~~ST
204
IoDrvStartBusCycle_Count := IoDrvStartBusCycle_Count + 1;
205
206
//if background diagnosis is not active call IoDrvGetModuleDiagnosis; normally it will be called by the runtime if DRVPROP_BACKGROUND_GETDIAG is set
207
IF NOT _xBackGroundDiagStarted THEN
208
    IoDrvGetModuleDiagnosis(m_pConnector); //DRVPROP_BACKGROUND_GETDIAG not set or runtime version &lt; V3.5.1.0
209
END_IF
210
211
//optional: call IoDrvWatchdogTrigger or set driver property DRVPROP_WATCHDOG in UpdateConfiguration
212
IoDrvWatchdogTrigger(pConnector);
213
214
IF NOT _bDeactivated THEN
215
    _MCP3008.AfterReadInputs();
216
    _MCP3008.BeforeWriteOutputs();
217
END_IF
218
219
IoDrvStartBusCycle := Errors.ERR_OK;
220
~~~
221
---
222
~~~ST
223
METHOD IoDrvUpdateConfiguration: UDINT
224
VAR_INPUT
225
    pConnectorList: pointer;
226
    nCount: DINT;
227
END_VAR
228
VAR
229
    pParameter: pointer;
230
    pChild: pointer;
231
    pstConnectorVendorName: pointer;
232
    pstConnectorDeviceName: pointer;
233
    Result: RTS_IEC_RESULT;
234
    i: INT;
235
    bySetting: BYTE;
236
END_VAR
237
238
~~~
239
~~~ST
240
IoDrvUpdateConfiguration_Count := IoDrvUpdateConfiguration_Count + 1;
241
IoDrvUpdateConfiguration := Errors.ERR_OK;
242
243
IF (pConnectorList = 0) THEN
244
    RETURN;
245
END_IF
246
247
m_pConnector := IoMgrConfigGetConnector(pConnectorList, ADR(nCount), m_wModuleType, m_dwInstance);
248
249
IF m_pConnector = 0 THEN
250
    IoDrvUpdateConfiguration := ERRORS.ERR_PARAMETER;
251
    RETURN;
252
END_IF
253
254
//check if device is enabled in the device tree
255
IF (m_pConnector^.dwFlags AND ConnectorFlags.CF_ENABLE) = 0 THEN
256
    _bDeactivated := TRUE;
257
    IoDrvUpdateConfiguration := Errors.ERR_OK;
258
    RETURN;
259
END_IF
260
261
IF m_pConnector^.hIoDrv = 0 THEN
262
    m_pConnector^.hIoDrv := m_hInterface;
263
    m_pConnector^.pFather^.hIoDrv := m_hInterface;
264
    
265
    {IF defined (pou:IoMgrConfigSetDiagnosis)}
266
    IoMgrConfigSetDiagnosis(m_pConnector,
267
                            ConnectorFlags.CF_DRIVER_AVAILABLE OR
268
                            ConnectorFlags.CF_CONNECTOR_FOUND OR
269
                            ConnectorFlags.CF_CONNECTOR_CONFIGURED OR
270
                            ConnectorFlags.CF_CONNECTOR_ACTIVE);
271
    {END_IF}
272
    
273
    {IF defined (pou:IoMgrConfigSetDiagnosis)}
274
    IoMgrConfigSetDiagnosis(m_pConnector^.pFather,
275
                            ConnectorFlags.CF_DRIVER_AVAILABLE OR
276
                            ConnectorFlags.CF_CONNECTOR_FOUND OR
277
                            ConnectorFlags.CF_CONNECTOR_CONFIGURED OR
278
                            ConnectorFlags.CF_CONNECTOR_ACTIVE);
279
    {END_IF}
280
281
    {IF defined (pou:IoMgrSetDriverProperties)}         
282
        IoMgrSetDriverProperties(m_hInterface, DRVPROP_CONSISTENCY OR DRVPROP_BACKGROUND_GETDIAG);
283
        //Note: background diagnosis property flag is optional (supported with 3.5.1.0 runtime)
284
    {END_IF}                                        
285
    
286
    //Setup I/O area
287
    FOR i:=0 TO 7 DO
288
        pParameter := IoMgrConfigGetParameter(m_pConnector, 1000 + i);
289
        IF (pParameter &lt;&gt; 0) THEN
290
            pParameter^.dwDriverSpecific := ADR(_MCP3008.auiValue[i]);
291
        END_IF
292
    END_FOR
293
END_IF
294
~~~
295
---
296
~~~ST
297
METHOD IoDrvUpdateMapping: UDINT
298
VAR_INPUT
299
    pTaskMapList: pointer;
300
    nCount: DINT;
301
END_VAR
302
303
~~~
304
~~~ST
305
IoDrvUpdateMapping_Count := IoDrvUpdateMapping_Count + 1;
306
307
IF (pTaskMapList = 0) THEN
308
    IoDrvUpdateMapping := Errors.ERR_PARAMETER;
309
    RETURN;
310
END_IF
311
312
IoDrvUpdateMapping := Errors.ERR_OK;
313
~~~
314
---
315
~~~ST
316
METHOD IoDrvWatchdogTrigger: UDINT
317
VAR_INPUT
318
    pConnector: pointer;
319
END_VAR
320
321
~~~
322
~~~ST
323
IoDrvWatchdogTrigger_Count := IoDrvWatchdogTrigger_Count + 1;
324
IoDrvWatchdogTrigger := Errors.ERR_OK;
325
~~~
326
---
327
~~~ST
328
METHOD IoDrvWriteOutputs: UDINT
329
VAR_INPUT
330
    pConnectorMapList: pointer;
331
    nCount: DINT;
332
END_VAR
333
VAR
334
    i: DINT;
335
    j: DINT;
336
    k: UINT;
337
    wSize: WORD;
338
    pbyIecAddress: pointer;
339
    bySrcValue: BYTE;
340
    wSrcIndex: WORD;
341
    bySrcMask: BYTE;
342
    wDestIndex: WORD;
343
    pdw: pointer;
344
    pw: pointer;
345
END_VAR
346
347
~~~
348
~~~ST
349
IoDrvWriteOutputs_Count := IoDrvWriteOutputs_Count + 1;
350
IoDrvWriteOutputs := Errors.ERR_OK;
351
~~~
352
---
353
~~~ST
354
METHOD IoDrvReadParameter: UDINT
355
VAR_INPUT
356
    pConnector: pointer;
357
    pParameter: pointer;
358
    pData: pointer;
359
    dwBitSize: DWORD;
360
    dwBitOffset: DWORD;
361
END_VAR
362
363
~~~
364
~~~ST
365
IF  pConnector = 0 OR pParameter = 0 OR pData = 0 THEN
366
    IoDrvReadParameter := Errors.ERR_PARAMETER;
367
    RETURN; 
368
END_IF
369
370
// All standard parameters of our device are handled by the IO-manager!
371
IoDrvReadParameter := Errors.ERR_FAILED;
372
373
~~~
374
---
375
~~~ST
376
METHOD IoDrvWriteParameter: UDINT
377
VAR_INPUT
378
    pConnector: pointer;
379
    pParameter: pointer;
380
    pData: pointer;
381
    dwBitSize: DWORD;
382
    dwBitOffset: DWORD;
383
END_VAR
384
VAR
385
    pParam: pointer;
386
    pstDiagString: pointer;
387
END_VAR
388
389
~~~
390
~~~ST
391
IF pConnector = 0 OR pParameter = 0 OR pData = 0 THEN
392
    IoDrvWriteParameter := Errors.ERR_PARAMETER;
393
    RETURN; 
394
END_IF
395
396
IoDrvWriteParameter := Errors.ERR_FAILED;
397
~~~
398
---
399
400
~~~ST
401
FUNCTION_BLOCK MCP3008 EXTENDS spi
402
VAR_OUTPUT
403
    auiValue: ARRAY [..] OF ;
404
END_VAR
405
406
~~~
407
~~~ST
408
SUPER^();
409
410
CASE _iState OF
411
0:
412
    IF SUPER^.init() THEN
413
        _iState := 1;
414
    END_IF  
415
1:
416
    _iState := 10;
417
END_CASE
418
419
~~~
420
---
421
~~~ST
422
METHOD AfterReadInputs: INT
423
VAR
424
    aby: ARRAY [..] OF ;
425
    usiChannel: USINT;
426
    ui: UINT;
427
END_VAR
428
429
~~~
430
~~~ST
431
SUPER^.AfterReadInputs();
432
433
IF _iState = 10 THEN
434
435
    FOR usiChannel := 0 TO 7 DO
436
        aby[0] := 1;
437
        aby[1] := 16#80 + SHL(usiChannel AND 7, 4);
438
        aby[2] := 0;    
439
        
440
        IF NOT transfer(pabyTxBuffer:=ADR(aby) , pabyRxBuffer:=ADR(aby) , udiLen:=3 , uiDelayus:=0) THEN
441
            _iState := 1000;
442
        END_IF
443
444
        ui := aby[2];
445
        ui := ui + (BYTE_TO_UINT(aby[1]) AND 2#11) * 256;
446
        auiValue[usiChannel] := ui;
447
    END_FOR     
448
END_IF
449
450
~~~
451
---
452
~~~ST
453
METHOD BeforeWriteOutputs: INT
454
VAR
455
    i: USINT;
456
END_VAR
457
458
~~~
459
~~~ST
460
SUPER^.BeforeWriteOutputs();
461
462
~~~
463
---
464
~~~ST
465
METHOD Initialize: UDINT
466
VAR_INPUT
467
    wModuleType: UINT;
468
    dwInstance: UDINT;
469
    pConnector: pointer;
470
END_VAR
471
VAR
472
    pParam: pointer;
473
    udiResult: UDINT;
474
END_VAR
475
476
~~~
477
~~~ST
478
SUPER^.Initialize(wModuleType, dwInstance, pConnector);
479
480
481
482
~~~