-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathFbScale.SCL
More file actions
106 lines (94 loc) · 3.03 KB
/
Copy pathFbScale.SCL
File metadata and controls
106 lines (94 loc) · 3.03 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
FUNCTION_BLOCK "FbScale"
TITLE = 'Ìàñøòàáèðîâàíèå InMin...InMax -> OutMin...OutMax.'
{ S7_read_back := 'true' ;
S7_blockview := 'big' }
AUTHOR : VA
FAMILY : LIB_PLC
VERSION : '2.1'
VAR_INPUT // Âõîäíûå ïåðåìåííûå, ñîõðàíÿåìûå.
In :REAL:= 0.0 ; // Âõîä äî ìàñøòàáèðîâàíèÿ.
InMax :REAL:= 27648.0; // Ìàêñèìóì âõîäíîãî äèàïàçîíà.
InMin :REAL:= 0.0 ; // Ìèíèìóì âõîäíîãî äèàïàçîíà.
OutMax :REAL:= 20.0 ; // Ìàêñèìóì âûõîäíîãî äèàïàçîíà.
OutMin :REAL:= 4.0 ; // Ìèíèìóì âûõîäíîãî äèàïàçîíà.
END_VAR
VAR_OUTPUT // Âûõîäíûå ïåðåìåííûå, ñîõðàíÿåìûå.
Out :REAL := 0.0; // Âûõîä ïîñëå ìàñøòàáèðîâàíèÿ.
END_VAR
BEGIN
// Ìàñøòàáèðîâàíèå InMin...InMax -> OutMin...OutMax.
// DbScale
// +-----------+
// | FbScale |
// ->-|In Out|->-
// -|InMax |
// -|InMin |
// -|OutMax |
// -|OutMin |
// +-----------+
// Ìàñøòàáèðîâàíèå ñèãíàëà.
IF (InMax = InMin) THEN // Äåëåíèå íà 0 ìîæåò îñòàíîâèòü ïðîöåññîð.
// Ïðè îøèáêå èñõîäíûõ äàííûõ.
Out := 0.0;
ELSE
// Ìàñøòàáèðîâàíèå.
Out := (OutMax - OutMin) * ((In - InMin)/(InMax - InMin)) + OutMin;
END_IF;
// Ñòàòè÷åñêàÿ õàðàêòåðèñòèêà.
//
// ^ Out
// |
// OutMax|<---------------*
// | * |
// | * |
// Out|<---------* |
// | * | |
// | * | |
// OutMin|<---* | |
// | | | |
// | | | |
// +---------------------> In
// InMin In InMax
// Âûõîä ñèãíàë
// Out = k * In + b
//
// Äëÿ ðàñ÷åòà k, b íàäî ðåøèòü ñèñòåìó äâóõ ëèíåéíûõ óðàâíåíèé ñ äâóìÿ íåèçâåñòíûìè.
// {OutMax = k * InMax + b
// {OutMin = k * InMin + b
//
// Óñèëåíèå:
// OutMax - OutMin
// k = -----------------
// InMax - InMin
//
// Ñìåùåíèå:
// b = OutMax - k * InMax
//
// Ïîñëå ïîäñòàíîâêè â óðàâíåíèå Out = k * In + b êîíñòàíò k, b,
// è ñîêðàùåíèÿ ÷èñëà àðèôìåòè÷åñêèõ îïåðàöèé äî ìèíèìóìà ïîëó÷àåì:
// Out := (OutMax - OutMin) * ((In - InMin)/(InMax - InMin)) + OutMin;
// Äàííîå ëèíåéíîå ïðåîáðàçîâàíèå íà ïðàêòèêå ëåãêî âûâåñòè ÷åðåç ïðîìåæóòî÷íûé äèàïïàçîí 0...1:
// InMin...InMax -> 0...(InMax-InMin) -> 0...1 -> 0...(OutMax-OutMin) -> OutMin...OutMax.
// Ïðèìåð ðàññ÷åòà äàâëåíèÿ ñ äàò÷èêà 4...20ìÀ -> 0...10Áàð.
// 4...20 - 4 = 0...16
// 0...16 / 16 = 0...1
// 0...1 * 10 = 0...10
// Ïðè òîêå 12ìÀ
// 12 - 4 = 8
// 8 / 16 = 0.5
// 0.5 * 10 = 5Áàð
// Äàâëåíèå 5Áàð.
// @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