Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
proview
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Esteban Blanc
proview
Commits
3e71ab1d
Commit
3e71ab1d
authored
May 16, 2012
by
Claes Sjofors
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Trend curves, user storage function added
parent
a1a1d15d
Changes
11
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
890 additions
and
585 deletions
+890
-585
src/exe/rt_neth/src/rt_neth.c
src/exe/rt_neth/src/rt_neth.c
+3
-150
src/lib/rt/src/rt_cbuf.c
src/lib/rt/src/rt_cbuf.c
+653
-0
src/lib/rt/src/rt_cbuf.h
src/lib/rt/src/rt_cbuf.h
+75
-0
src/lib/rt/src/rt_gdh.c
src/lib/rt/src/rt_gdh.c
+0
-375
src/lib/rt/src/rt_gdh.h
src/lib/rt/src/rt_gdh.h
+0
-27
src/wbl/pwrb/src/pwrb_c_circbuff1k.wb_load
src/wbl/pwrb/src/pwrb_c_circbuff1k.wb_load
+4
-4
src/wbl/pwrb/src/pwrb_c_circbuff2k.wb_load
src/wbl/pwrb/src/pwrb_c_circbuff2k.wb_load
+87
-0
src/wbl/pwrb/src/pwrb_c_dstrendcurve.wb_load
src/wbl/pwrb/src/pwrb_c_dstrendcurve.wb_load
+50
-26
wb/exp/wb/src/pwr_wb_palette.cnf
wb/exp/wb/src/pwr_wb_palette.cnf
+10
-0
xtt/lib/xtt/src/xtt_trend.cpp
xtt/lib/xtt/src/xtt_trend.cpp
+3
-2
xtt/lib/xtt/src/xtt_trend.h
xtt/lib/xtt/src/xtt_trend.h
+5
-1
No files found.
src/exe/rt_neth/src/rt_neth.c
View file @
3e71ab1d
...
...
@@ -67,6 +67,7 @@
#include "rt_cvol.h"
#include "rt_cvolsm.h"
#include "rt_cvolcm.h"
#include "rt_cbuf.h"
#include "rt_pwr_msg.h"
/* Declare routines used by main. */
...
...
@@ -100,8 +101,6 @@ static void volumesR (qcom_sGet*);
static
void
volumes7
(
qcom_sGet
*
);
static
void
serverConnect
(
qcom_sGet
*
);
static
void
fileList
(
qcom_sGet
*
);
static
void
getCircBuffer
(
qcom_sGet
*
);
static
void
updateCircBuffer
(
qcom_sGet
*
);
#if 0
static void linkEvent (pwr_tUInt32, net_eEvent);
static void sendIdAck (gdb_sNode*);
...
...
@@ -186,9 +185,9 @@ static void (*fromApplication[net_eMsg_end])(qcom_sGet *) = {
serverConnect
,
/* net_eMsg_serverConnect */
fileList
,
/* net_eMsg_fileList */
bugError
,
/* net_eMsg_fileListR, will never reach neth. */
getCircBuffer
,
/* net_eMsg_getCircBuffer */
cbuf_GetCircBufferMsg
,
/* net_eMsg_getCircBuffer */
bugError
,
/* net_eMsg_getCircBufferR, will never reach neth. */
updateCircBuffer
,
/* net_eMsg_updateCircBuffer */
cbuf_UpdateCircBufferMsg
,
/* net_eMsg_updateCircBuffer */
bugError
,
/* net_eMsg_updateCircBufferR, will never reach neth. */
bugError
,
/* net_eMsg_ */
volumes7
...
...
@@ -1567,149 +1566,3 @@ fileList (
net_Reply
(
&
sts
,
get
,
&
put
,
0
);
}
static
void
getCircBuffer
(
qcom_sGet
*
get
)
{
net_sGetCircBuffer
*
mp
=
get
->
data
;
net_sGetCircBufferR
*
rmp
;
gdb_sNode
*
np
;
pwr_tStatus
sts
;
pwr_tUInt32
size
;
qcom_sPut
put
;
gdh_sCircBuffInfo
info
;
gdb_ScopeLock
{
np
=
hash_Search
(
&
sts
,
gdbroot
->
nid_ht
,
&
mp
->
hdr
.
nid
);
}
gdb_ScopeUnlock
;
if
(
gdbroot
->
db
->
log
.
b
.
id
)
{
errh_Info
(
"Sending 'getCircBuffer' to %s (%s)"
,
np
->
name
,
cdh_NodeIdToString
(
NULL
,
np
->
nid
,
0
,
0
));
}
info
.
circ_aref
=
mp
->
circ_aref
;
info
.
resolution
=
mp
->
resolution
;
info
.
samples
=
mp
->
samples
;
info
.
bufsize
=
mp
->
bufsize
;
info
.
bufp
=
calloc
(
1
,
info
.
bufsize
);
sts
=
gdh_GetCircBuffInfo
(
&
info
,
1
);
if
(
EVEN
(
sts
))
size
=
sizeof
(
*
rmp
);
else
size
=
sizeof
(
*
rmp
)
+
info
.
bufsize
;
size
=
(
size
+
3
)
&
~
3
;
/* Size up to nearest multiple of 4. */
rmp
=
net_Alloc
(
&
sts
,
&
put
,
size
,
net_eMsg_getCircBufferR
);
if
(
rmp
==
NULL
)
{
errh_Error
(
"Failed to allocate 'getCircBufferR' to %s (%s)"
,
np
->
name
,
cdh_NodeIdToString
(
NULL
,
np
->
nid
,
0
,
0
));
return
;
}
rmp
->
sts
=
sts
;
if
(
EVEN
(
sts
))
{
rmp
->
sts
=
sts
;
rmp
->
size
=
0
;
}
else
{
rmp
->
sts
=
sts
;
rmp
->
circ_aref
=
info
.
circ_aref
;
rmp
->
size
=
info
.
size
;
rmp
->
bufsize
=
info
.
bufsize
;
rmp
->
first_idx
=
info
.
first_idx
;
rmp
->
last_idx
=
info
.
last_idx
;
rmp
->
offset
=
info
.
offset
;
memcpy
(
rmp
->
buf
,
info
.
bufp
,
info
.
bufsize
);
free
(
info
.
bufp
);
}
net_Reply
(
&
sts
,
get
,
&
put
,
0
);
}
static
void
updateCircBuffer
(
qcom_sGet
*
get
)
{
net_sUpdateCircBuffer
*
mp
=
get
->
data
;
net_sUpdateCircBufferR
*
rmp
;
gdb_sNode
*
np
;
pwr_tStatus
sts
;
pwr_tUInt32
size
;
pwr_tUInt32
total_size
;
qcom_sPut
put
;
gdh_sCircBuffInfo
info
[
10
];
int
i
,
offs
;
gdb_ScopeLock
{
np
=
hash_Search
(
&
sts
,
gdbroot
->
nid_ht
,
&
mp
->
hdr
.
nid
);
}
gdb_ScopeUnlock
;
if
(
gdbroot
->
db
->
log
.
b
.
id
)
{
errh_Info
(
"Sending 'updateCircBuffer' to %s (%s)"
,
np
->
name
,
cdh_NodeIdToString
(
NULL
,
np
->
nid
,
0
,
0
));
}
if
(
mp
->
info_size
>=
10
)
{
errh_Error
(
"Parameter size error 'updateCircBufferR' to %s (%s)"
,
np
->
name
,
cdh_NodeIdToString
(
NULL
,
np
->
nid
,
0
,
0
));
return
;
}
for
(
i
=
0
;
i
<
mp
->
info_size
;
i
++
)
{
info
[
i
].
circ_aref
=
mp
->
circ_aref
[
i
];
info
[
i
].
resolution
=
mp
->
resolution
[
i
];
info
[
i
].
samples
=
mp
->
samples
[
i
];
info
[
i
].
last_idx
=
mp
->
last_idx
[
i
];
info
[
i
].
offset
=
mp
->
offset
[
i
];
info
[
i
].
bufsize
=
mp
->
bufsize
[
i
];
info
[
i
].
bufp
=
calloc
(
1
,
info
[
i
].
bufsize
);
}
sts
=
gdh_UpdateCircBuffInfo
(
info
,
mp
->
info_size
);
if
(
EVEN
(
sts
))
size
=
sizeof
(
*
rmp
);
else
{
total_size
=
0
;
for
(
i
=
0
;
i
<
mp
->
info_size
;
i
++
)
total_size
+=
info
[
i
].
bufsize
;
size
=
sizeof
(
*
rmp
)
+
total_size
;
}
size
=
(
size
+
3
)
&
~
3
;
/* Size up to nearest multiple of 4. */
rmp
=
net_Alloc
(
&
sts
,
&
put
,
size
,
net_eMsg_updateCircBufferR
);
if
(
rmp
==
NULL
)
{
errh_Error
(
"Failed to allocate 'updateCircBufferR' to %s (%s)"
,
np
->
name
,
cdh_NodeIdToString
(
NULL
,
np
->
nid
,
0
,
0
));
return
;
}
rmp
->
sts
=
sts
;
if
(
EVEN
(
sts
))
{
rmp
->
sts
=
sts
;
rmp
->
bsize
=
0
;
}
else
{
rmp
->
sts
=
sts
;
rmp
->
info_size
=
mp
->
info_size
;
rmp
->
bsize
=
total_size
;
offs
=
0
;
for
(
i
=
0
;
i
<
mp
->
info_size
;
i
++
)
{
rmp
->
circ_aref
[
i
]
=
info
[
i
].
circ_aref
;
rmp
->
size
[
i
]
=
info
[
i
].
size
;
rmp
->
bufsize
[
i
]
=
info
[
i
].
bufsize
;
rmp
->
first_idx
[
i
]
=
info
[
i
].
first_idx
;
rmp
->
last_idx
[
i
]
=
info
[
i
].
last_idx
;
rmp
->
offset
[
i
]
=
info
[
i
].
offset
;
memcpy
(
rmp
->
buf
+
offs
,
info
[
i
].
bufp
,
info
[
i
].
bufsize
);
offs
+=
info
[
i
].
bufsize
;
free
(
info
[
i
].
bufp
);
}
}
net_Reply
(
&
sts
,
get
,
&
put
,
0
);
}
src/lib/rt/src/rt_cbuf.c
0 → 100644
View file @
3e71ab1d
This diff is collapsed.
Click to expand it.
src/lib/rt/src/rt_cbuf.h
0 → 100644
View file @
3e71ab1d
/*
* Proview Open Source Process Control.
* Copyright (C) 2005-2012 SSAB EMEA AB.
*
* This file is part of Proview.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Proview. If not, see <http://www.gnu.org/licenses/>
*
* Linking Proview statically or dynamically with other modules is
* making a combined work based on Proview. Thus, the terms and
* conditions of the GNU General Public License cover the whole
* combination.
*
* In addition, as a special exception, the copyright holders of
* Proview give you permission to, from the build function in the
* Proview Configurator, combine Proview with modules generated by the
* Proview PLC Editor to a PLC program, regardless of the license
* terms of these modules. You may copy and distribute the resulting
* combined work under the terms of your choice, provided that every
* copy of the combined work is accompanied by a complete copy of
* the source code of Proview (the version used to produce the
* combined work), being distributed under the terms of the GNU
* General Public License plus this exception.
*/
#ifndef rt_cbuf_h
#define rt_cbuf_h
#if defined __cplusplus
extern
"C"
{
#endif
/**
* Circular buffer argument structure
*/
typedef
struct
{
pwr_sAttrRef
circ_aref
;
/**< Attribute reference to circular buffer object */
unsigned
int
resolution
;
/**< Resolution of return data */
unsigned
int
samples
;
/**< number of data values */
void
*
bufp
;
/**< Data buffer that receives the requested information */
unsigned
int
bufsize
;
/**< The size in bytes of the data buffer */
unsigned
int
size
;
/**< Number of returned values */
unsigned
int
first_idx
;
/**< First index, this has to be saved to the next call */
unsigned
int
last_idx
;
/**< Last index, this has to be saved to the next call */
unsigned
int
offset
;
/**< Index offset to use in the next call */
}
cbuf_sCircBuffInfo
;
pwr_tStatus
cbuf_GetCircBuffInfo
(
cbuf_sCircBuffInfo
*
info
,
int
infosize
);
pwr_tStatus
cbuf_UpdateCircBuffInfo
(
cbuf_sCircBuffInfo
*
info
,
int
infosize
);
void
cbuf_GetCircBufferMsg
(
qcom_sGet
*
get
);
void
cbuf_UpdateCircBufferMsg
(
qcom_sGet
*
get
);
void
cbuf_InitBuffer
(
void
*
o
,
pwr_tUInt32
size
,
pwr_tUInt32
element_size
);
void
cbuf_AddSample
(
void
*
o
,
void
*
value
);
void
cbuf_AddTimeSample
(
void
*
o
,
pwr_tTime
*
t
);
#if defined __cplusplus
}
#endif
#endif
src/lib/rt/src/rt_gdh.c
View file @
3e71ab1d
...
...
@@ -72,7 +72,6 @@
#include "rt_subc.h"
#include "rt_sanc.h"
#include "rt_dl.h"
#include "pwr_baseclasses.h"
#if defined(OS_ELN)
/* For ELN and Lynx , the 'gdh_Lock' code also takes out a mutex lock
...
...
@@ -5050,377 +5049,3 @@ pwr_tStatus gdh_GetNextSubClass( pwr_tCid cid, pwr_tCid psubcid, pwr_tCid *subci
return
GDH__NOSUCHCLASS
;
}
pwr_tStatus
gdh_GetCircBuffInfo
(
gdh_sCircBuffInfo
*
info
,
int
infosize
)
{
pwr_tStatus
sts
=
GDH__SUCCESS
;
mvol_sAttribute
attribute
;
mvol_sAttribute
*
ap
;
pwr_sClass_CircBuffHeader
*
hp
;
char
*
datap
;
int
split
=
0
;
int
start_idx
;
int
first_index
,
last_index
;
int
samples
;
int
j
;
memset
(
&
attribute
,
0
,
sizeof
(
attribute
));
gdh_Lock
;
for
(
j
=
0
;
j
<
infosize
;
j
++
)
{
while
(
1
)
{
ap
=
vol_ArefToAttribute
(
&
sts
,
&
attribute
,
&
info
[
j
].
circ_aref
,
gdb_mLo_global
,
vol_mTrans_all
);
if
(
ap
==
NULL
||
ap
->
op
==
NULL
)
break
;
if
(
ap
->
op
->
l
.
flags
.
b
.
isCached
)
{
net_sGetCircBuffer
*
mp
;
qcom_sPut
put
;
gdb_sVolume
*
vp
;
qcom_sQid
tgt
;
qcom_sGet
get
;
net_sGetCircBufferR
*
rsp
;
gdb_sNode
*
np
;
vp
=
pool_Address
(
NULL
,
gdbroot
->
pool
,
ap
->
op
->
l
.
vr
);
if
(
vp
==
NULL
)
{
sts
=
GDH__NOSUCHOBJ
;
break
;
}
mp
=
net_Alloc
(
&
sts
,
&
put
,
sizeof
(
*
mp
),
net_eMsg_getCircBuffer
);
if
(
mp
==
NULL
)
break
;
mp
->
circ_aref
=
info
->
circ_aref
;
mp
->
resolution
=
info
->
resolution
;
mp
->
samples
=
info
->
samples
;
mp
->
bufsize
=
info
->
bufsize
;
np
=
hash_Search
(
&
sts
,
gdbroot
->
nid_ht
,
&
vp
->
g
.
nid
);
if
(
np
==
NULL
)
break
;
tgt
=
np
->
handler
;
gdb_Unlock
;
rsp
=
net_Request
(
&
sts
,
&
tgt
,
&
put
,
&
get
,
net_eMsg_getCircBufferR
,
0
,
0
);
gdb_Lock
;
if
(
EVEN
(
sts
))
break
;
if
(
EVEN
(
rsp
->
sts
))
{
sts
=
rsp
->
sts
;
net_Free
(
NULL
,
rsp
);
break
;
}
if
(
cdh_ObjidIsNotEqual
(
rsp
->
circ_aref
.
Objid
,
info
->
circ_aref
.
Objid
))
{
sts
=
0
;
break
;
}
info
->
size
=
rsp
->
size
;
info
->
bufsize
=
rsp
->
bufsize
;
info
->
first_idx
=
rsp
->
first_idx
;
info
->
last_idx
=
rsp
->
last_idx
;
info
->
offset
=
rsp
->
offset
;
info
->
bufp
=
calloc
(
1
,
info
->
bufsize
);
memcpy
(
info
->
bufp
,
rsp
->
buf
,
info
->
bufsize
);
net_Free
(
NULL
,
rsp
);
break
;
}
touchObject
(
ap
->
op
);
samples
=
info
[
j
].
samples
;
hp
=
vol_AttributeToAddress
(
&
sts
,
ap
);
if
(
hp
!=
NULL
)
{
if
(
hp
->
FirstIndex
==
hp
->
LastIndex
)
return
0
;
if
(
info
[
j
].
resolution
<=
1
)
{
if
(
samples
>
hp
->
Size
)
samples
=
hp
->
Size
;
datap
=
(
char
*
)
hp
+
pwr_AlignLW
(
sizeof
(
pwr_sClass_CircBuffHeader
));
first_index
=
hp
->
FirstIndex
;
last_index
=
hp
->
LastIndex
;
start_idx
=
last_index
-
samples
;
if
(
first_index
<
last_index
)
{
if
(
first_index
>
start_idx
)
start_idx
=
first_index
;
}
else
{
if
(
start_idx
<
0
)
{
split
=
1
;
start_idx
=
hp
->
Size
+
start_idx
;
if
(
start_idx
<
first_index
)
start_idx
=
first_index
;
}
}
if
(
split
)
{
memcpy
(
info
[
j
].
bufp
,
datap
+
start_idx
*
hp
->
ElementSize
,
(
hp
->
Size
-
start_idx
)
*
hp
->
ElementSize
);
memcpy
(
info
[
j
].
bufp
+
(
hp
->
Size
-
start_idx
)
*
hp
->
ElementSize
,
datap
,
last_index
*
hp
->
ElementSize
);
info
[
j
].
size
=
hp
->
Size
-
start_idx
+
last_index
;
}
else
{
memcpy
(
info
[
j
].
bufp
,
datap
+
start_idx
*
hp
->
ElementSize
,
(
last_index
-
start_idx
)
*
hp
->
ElementSize
);
info
[
j
].
size
=
last_index
-
start_idx
;
}
info
[
j
].
last_idx
=
last_index
;
info
[
j
].
first_idx
=
first_index
;
info
[
j
].
offset
=
0
;
}
else
{
/* Resolution > 0 */
int
elements
;
char
*
dp
,
*
bp
;
int
i
;
int
idx
,
tst_first_idx
;
if
(
samples
>
hp
->
Size
/
info
[
j
].
resolution
)
samples
=
hp
->
Size
/
info
[
j
].
resolution
;
datap
=
(
char
*
)
hp
+
pwr_AlignLW
(
sizeof
(
pwr_sClass_CircBuffHeader
));
first_index
=
hp
->
FirstIndex
;
last_index
=
hp
->
LastIndex
;
start_idx
=
last_index
-
(
samples
-
1
)
*
info
[
j
].
resolution
;
tst_first_idx
=
first_index
;
if
(
first_index
>
last_index
)
tst_first_idx
-=
hp
->
Size
;
if
(
start_idx
<
tst_first_idx
)
start_idx
+=
(
tst_first_idx
-
start_idx
)
/
info
[
j
].
resolution
*
info
[
j
].
resolution
;
elements
=
(
last_index
-
start_idx
)
/
info
[
j
].
resolution
+
1
;
info
[
j
].
size
=
elements
;
info
[
j
].
offset
=
info
[
j
].
resolution
;
if
(
start_idx
<
0
)
start_idx
+=
hp
->
Size
;
bp
=
info
[
j
].
bufp
;
idx
=
start_idx
;
for
(
i
=
0
;
i
<
elements
;
i
++
)
{
dp
=
datap
+
idx
*
hp
->
ElementSize
;
memcpy
(
bp
,
dp
,
hp
->
ElementSize
);
// printf( "sp1: %d\n", idx);
bp
+=
hp
->
ElementSize
;
idx
+=
info
[
j
].
resolution
;
if
(
idx
>=
hp
->
Size
)
idx
-=
hp
->
Size
;
}
info
[
j
].
last_idx
=
last_index
;
info
[
j
].
first_idx
=
first_index
;
}
sts
=
GDH__SUCCESS
;
}
else
sts
=
0
;
break
;
}
gdh_Unlock
;
}
return
sts
;
}
pwr_tStatus
gdh_UpdateCircBuffInfo
(
gdh_sCircBuffInfo
*
info
,
int
infosize
)
{
pwr_tStatus
sts
=
GDH__SUCCESS
;
mvol_sAttribute
attribute
;
mvol_sAttribute
*
ap
;
pwr_sClass_CircBuffHeader
*
hp
;
char
*
datap
;
int
split
=
0
;
int
start_idx
;
int
first_index
,
last_index
;
int
finish
=
0
;
int
j
;
memset
(
&
attribute
,
0
,
sizeof
(
attribute
));
for
(
j
=
0
;
j
<
infosize
;
j
++
)
{
gdh_Lock
;
while
(
1
)
{
ap
=
vol_ArefToAttribute
(
&
sts
,
&
attribute
,
&
info
[
j
].
circ_aref
,
gdb_mLo_global
,
vol_mTrans_all
);
if
(
ap
==
NULL
||
ap
->
op
==
NULL
)
break
;
if
(
ap
->
op
->
l
.
flags
.
b
.
isCached
)
{
net_sUpdateCircBuffer
*
mp
;
qcom_sPut
put
;
gdb_sVolume
*
vp
;
qcom_sQid
tgt
;
qcom_sGet
get
;
net_sUpdateCircBufferR
*
rsp
;
gdb_sNode
*
np
;
int
i
;
int
offs
;
vp
=
pool_Address
(
NULL
,
gdbroot
->
pool
,
ap
->
op
->
l
.
vr
);
if
(
vp
==
NULL
)
{
sts
=
GDH__NOSUCHOBJ
;
break
;
}
mp
=
net_Alloc
(
&
sts
,
&
put
,
sizeof
(
*
mp
),
net_eMsg_updateCircBuffer
);
if
(
mp
==
NULL
)
break
;
mp
->
info_size
=
infosize
;
if
(
mp
->
info_size
>
10
)
mp
->
info_size
=
10
;
for
(
i
=
0
;
i
<
infosize
;
i
++
)
{
mp
->
circ_aref
[
i
]
=
info
[
i
].
circ_aref
;
mp
->
resolution
[
i
]
=
info
[
i
].
resolution
;
mp
->
samples
[
i
]
=
info
[
i
].
samples
;
mp
->
bufsize
[
i
]
=
info
[
i
].
bufsize
;
mp
->
last_idx
[
i
]
=
info
[
i
].
last_idx
;
mp
->
offset
[
i
]
=
info
[
i
].
offset
;
}
np
=
hash_Search
(
&
sts
,
gdbroot
->
nid_ht
,
&
vp
->
g
.
nid
);
if
(
np
==
NULL
)
break
;
tgt
=
np
->
handler
;
gdb_Unlock
;
rsp
=
net_Request
(
&
sts
,
&
tgt
,
&
put
,
&
get
,
net_eMsg_updateCircBufferR
,
0
,
0
);
gdb_Lock
;
if
(
EVEN
(
sts
))
break
;
if
(
EVEN
(
rsp
->
sts
))
{
sts
=
rsp
->
sts
;
net_Free
(
NULL
,
rsp
);
break
;
}
offs
=
0
;
for
(
i
=
0
;
i
<
rsp
->
info_size
;
i
++
)
{
if
(
cdh_ObjidIsNotEqual
(
rsp
->
circ_aref
[
i
].
Objid
,
info
[
i
].
circ_aref
.
Objid
))
{
sts
=
0
;
break
;
}
info
[
i
].
size
=
rsp
->
size
[
i
];
info
[
i
].
bufsize
=
rsp
->
bufsize
[
i
];
info
[
i
].
first_idx
=
rsp
->
first_idx
[
i
];
info
[
i
].
last_idx
=
rsp
->
last_idx
[
i
];
info
[
i
].
offset
=
rsp
->
offset
[
i
];
info
[
i
].
bufp
=
calloc
(
1
,
info
[
i
].
bufsize
);
memcpy
(
info
[
i
].
bufp
,
rsp
->
buf
+
offs
,
info
[
i
].
bufsize
);
offs
+=
info
[
i
].
bufsize
;
}
net_Free
(
NULL
,
rsp
);
finish
=
1
;
break
;
}
touchObject
(
ap
->
op
);
hp
=
vol_AttributeToAddress
(
&
sts
,
ap
);
if
(
hp
!=
NULL
)
{
if
(
hp
->
FirstIndex
==
hp
->
LastIndex
)
{
info
[
j
].
size
=
0
;
break
;
}
if
(
info
[
j
].
resolution
<=
1
)
{
datap
=
(
char
*
)
hp
+
pwr_AlignLW
(
sizeof
(
pwr_sClass_CircBuffHeader
));
first_index
=
info
[
j
].
last_idx
;
last_index
=
hp
->
LastIndex
;
start_idx
=
last_index
-
info
[
j
].
samples
;
if
(
first_index
<
last_index
)
{
if
(
first_index
>
start_idx
)
start_idx
=
first_index
;
}
else
{
if
(
start_idx
<
0
)
{
split
=
1
;
start_idx
=
hp
->
Size
+
start_idx
;
if
(
start_idx
<
first_index
)
start_idx
=
first_index
;
}
}
if
(
split
)
{
memcpy
(
info
[
j
].
bufp
,
datap
+
start_idx
*
hp
->
ElementSize
,
(
hp
->
Size
-
start_idx
)
*
hp
->
ElementSize
);
memcpy
(
info
[
j
].
bufp
+
(
hp
->
Size
-
start_idx
)
*
hp
->
ElementSize
,
datap
,
last_index
*
hp
->
ElementSize
);
info
[
j
].
size
=
hp
->
Size
-
start_idx
+
last_index
;
}
else
{
memcpy
(
info
[
j
].
bufp
,
datap
+
start_idx
*
hp
->
ElementSize
,
(
last_index
-
start_idx
)
*
hp
->
ElementSize
);
info
[
j
].
size
=
last_index
-
start_idx
;
}
info
[
j
].
last_idx
=
last_index
;
info
[
j
].
first_idx
=
first_index
;
info
[
j
].
offset
=
0
;
}
else
{
/* Resolution > 1 */
int
elements
;
char
*
dp
;
int
i
;
int
tst_idx
;
datap
=
(
char
*
)
hp
+
pwr_AlignLW
(
sizeof
(
pwr_sClass_CircBuffHeader
));
first_index
=
hp
->
FirstIndex
;
last_index
=
hp
->
LastIndex
;
tst_idx
=
last_index
;
if
(
tst_idx
<
info
[
j
].
last_idx
)
tst_idx
+=
hp
->
Size
;
start_idx
=
info
[
j
].
last_idx
+
info
[
j
].
offset
;
if
(
start_idx
>
tst_idx
)
{
info
[
j
].
size
=
0
;
break
;
}
elements
=
(
tst_idx
-
start_idx
)
/
info
[
j
].
resolution
+
1
;
info
[
j
].
offset
=
info
[
j
].
resolution
-
(
tst_idx
-
start_idx
-
(
elements
-
1
)
*
info
[
j
].
resolution
);
if
(
start_idx
>=
hp
->
Size
)
start_idx
-=
hp
->
Size
;
if
(
elements
>
info
[
j
].
samples
)
elements
=
info
[
j
].
samples
;
info
[
j
].
size
=
elements
;
for
(
i
=
0
;
i
<
elements
;
i
++
)
{
dp
=
datap
+
start_idx
*
hp
->
ElementSize
;
memcpy
(
info
[
j
].
bufp
+
i
*
hp
->
ElementSize
,
dp
,
hp
->
ElementSize
);
// printf( "%d idx: %d %5.2f el:%d off:%d lidx: prev %d curr %d\n", i, start_idx, *(float *)dp, elements, info[j].offset, info[j].last_idx, last_index);
start_idx
+=
info
[
j
].
resolution
;
if
(
start_idx
>=
hp
->
Size
)
start_idx
-=
hp
->
Size
;
}
info
[
j
].
last_idx
=
last_index
;
info
[
j
].
first_idx
=
first_index
;
}
sts
=
GDH__SUCCESS
;
}
else
sts
=
0
;
break
;
}
gdh_Unlock
;
if
(
finish
)
break
;
}
return
sts
;
}
src/lib/rt/src/rt_gdh.h
View file @
3e71ab1d
...
...
@@ -170,21 +170,6 @@ typedef struct {
}
gdh_sBitDef
;
/**
* Circular buffer argument structure
*/
typedef
struct
{
pwr_sAttrRef
circ_aref
;
/**< Attribute reference to circular buffer object */
unsigned
int
resolution
;
/**< Resolution of return data */
unsigned
int
samples
;
/**< number of data values */
void
*
bufp
;
/**< Data buffer that receives the requested information */
unsigned
int
bufsize
;
/**< The size in bytes of the data buffer */
unsigned
int
size
;
/**< Number of returned values */
unsigned
int
first_idx
;
/**< First index, this has to be saved to the next call */
unsigned
int
last_idx
;
/**< Last index, this has to be saved to the next call */
unsigned
int
offset
;
/**< Index offset to use in the next call */
}
gdh_sCircBuffInfo
;
/* GDH entrypoints (as function prototypes). */
/** @} */
...
...
@@ -815,18 +800,6 @@ gdh_SetObjectReadOnly(
pwr_tOid
oid
);
pwr_tStatus
gdh_GetCircBuffInfo
(
gdh_sCircBuffInfo
*
info
,
int
infosize
);
pwr_tStatus
gdh_UpdateCircBuffInfo
(
gdh_sCircBuffInfo
*
info
,
int
infosize
);
/* Undocumented functions. For internal use only. */
pwr_tStatus
...
...
src/wbl/pwrb/src/pwrb_c_circbuff1
000
.wb_load
→
src/wbl/pwrb/src/pwrb_c_circbuff1
k
.wb_load
View file @
3e71ab1d
...
...
@@ -33,7 +33,7 @@
! combined work), being distributed under the terms of the GNU
! General Public License plus this exception.
!
! pwrb_c_circbuff1
000.wb_load -- Defines the class CircBuff1000
.
! pwrb_c_circbuff1
k.wb_load -- Defines the class CircBuff1k
.
!
SObject pwrb:Class
!/**
...
...
@@ -41,7 +41,7 @@ SObject pwrb:Class
! @Summary Circular buffer with buffer size 1000 byte
! Circular buffer with buffer size 1000 byte.
!*/
Object CircBuff1
000
$ClassDef 595
Object CircBuff1
k
$ClassDef 595
Body SysBody
Attr Editor = pwr_eEditor_AttrEd
Attr Method = pwr_eMethod_Standard
...
...
@@ -49,7 +49,7 @@ SObject pwrb:Class
EndBody
Object RtBody $ObjBodyDef 1
Body SysBody
Attr StructName = "CircBuff1
000
"
Attr StructName = "CircBuff1
k
"
EndBody
!/**
! Buffer header.
...
...
@@ -73,7 +73,7 @@ SObject pwrb:Class
EndBody
EndObject
EndObject
Object Template CircBuff1
000
Object Template CircBuff1
k
Body RtBody
Attr Head.Size = 250
Attr Head.ElementSize = 4
...
...
src/wbl/pwrb/src/pwrb_c_circbuff2k.wb_load
0 → 100644
View file @
3e71ab1d
!
! Proview Open Source Process Control.
! Copyright (C) 2005-2012 SSAB EMEA AB.
!
! This file is part of Proview.
!
! This program is free software; you can redistribute it and/or
! modify it under the terms of the GNU General Public License as
! published by the Free Software Foundation, either version 2 of
! the License, or (at your option) any later version.
!
! This program is distributed in the hope that it will be useful
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! GNU General Public License for more details.
!
! You should have received a copy of the GNU General Public License
! along with Proview. If not, see <http://www.gnu.org/licenses/>
!
! Linking Proview statically or dynamically with other modules is
! making a combined work based on Proview. Thus, the terms and
! conditions of the GNU General Public License cover the whole
! combination.
!
! In addition, as a special exception, the copyright holders of
! Proview give you permission to, from the build function in the
! Proview Configurator, combine Proview with modules generated by the
! Proview PLC Editor to a PLC program, regardless of the license
! terms of these modules. You may copy and distribute the resulting
! combined work under the terms of your choice, provided that every
! copy of the combined work is accompanied by a complete copy of
! the source code of Proview (the version used to produce the
! combined work), being distributed under the terms of the GNU
! General Public License plus this exception.
!
! pwrb_c_circbuff2k.wb_load -- Defines the class CircBuff2k.
!
SObject pwrb:Class
!/**
! @Version 1.0
! @Summary Circular buffer with buffer size 2000 byte
! Circular buffer with buffer size 2000 byte.
!*/
Object CircBuff2k $ClassDef 600
Body SysBody
Attr Editor = pwr_eEditor_AttrEd
Attr Method = pwr_eMethod_Standard
Attr PopEditor = 1
EndBody
Object RtBody $ObjBodyDef 1
Body SysBody
Attr StructName = "CircBuff2k"
EndBody
!/**
! Buffer header.
!*/
Object Head $Attribute 1
Body SysBody
Attr TypeRef = "pwrb:Class-CircBuffHeader"
Attr Flags |= PWR_MASK_CLASS
EndBody
EndObject
!/**
! Data buffer.
!*/
Object Data $Attribute 2
Body SysBody
Attr TypeRef = "pwrs:Type-$UInt32"
Attr Flags |= PWR_MASK_ARRAY
Attr Flags |= PWR_MASK_STATE
Attr Flags |= PWR_MASK_INVISIBLE
Attr Elements = 500
EndBody
EndObject
EndObject
Object Template CircBuff2k
Body RtBody
Attr Head.Size = 500
Attr Head.ElementSize = 4
EndBody
EndObject
EndObject
EndSObject
src/wbl/pwrb/src/pwrb_c_dstrendcurve.wb_load
View file @
3e71ab1d
...
...
@@ -38,12 +38,11 @@
SObject pwrb:Class
!/**
! @Version 1.0
! Stores data for a
fast graph à la storage oscilloscope
.
! Stores data for a
trend graph
.
!
! In one DsFastCurve object, up to 10 attributes can be specified.
! The storage of the attributes will be trigger by the same event,
! stored with the same frequency, and the curves will be plotted
! in the same fastcurve window.
! In one DsTrendCurve object, up to 10 attributes can be specified.
! The attribute values will be stored with the same frequency, and the
! curves will be plotted in the same trend window.
!
! The names of the attributes is specified the the Attribute array.
! For every attribute, a storage area object also has to be specified.
...
...
@@ -51,33 +50,57 @@ SObject pwrb:Class
! objects, for example to store at different frequencies.
!
! The sampling rate is specified the the ScanTime attribute.
! The sampling will start when a trigger event is detected. In some
! cases, when data before the trigger event is valid, the sampling will
! go on even before the trigger event.
!
! @b Storage arrays
! Storage arrays has to be supplied by the user, one array for the time axis data, and
! one for each configured attribute. For example, Buff1440, Buff4096 or Buff32k objects
! can be used for the data storage. These will store up to 360, 1024 resp. 8192 points of
! pwr_tFloat32 attributes.
! @b Storage buffers
! Storage buffers has to be supplied by the user, one buffer for the time axis data, and
! one for each configured attribute. Object of type CircBuffer has to be used, eg
! CircBuff1k, CircBuff2k, CircBuff10k, CircBuff20k, CircBuf100k and CircBuff200k.
! A CircBuff1k object will for example store 250 samples of size 4 bytes and a
! CircBuff200k 50000.
!
! @b Data types
! The datatypes that can be stored is
! - pwr_tFloat32, pwr_tFloat64
! - pwr_tInt32, pwr_tUInt32, pwr_tInt16, pwr_tUInt16, pwr_tInt8, pwr_tUInt8
!
! The time is stored as pwr_tFloat32.
! The time is stored as one or two UInt32, dependent on the selected TimeResolution.
! The default time is of size 4 bytes where the seconds from epoch is stored. With time
! resolution nanoseconds the size is 8 bytes, and one word with the nanoseconds are added
! for each sample.
!
! @b Server
! DsTrendCurve objects is handled by the fast server rt_trend.
! The base frequency for the fast server process is configured in
! the DsTrendConf object.
!
! @b User storage
! Trend data can be stored by a user defined server, for example by the plc program.
! In this case a number of setting has to be done:
! - Function is set to 1.
! - AttributeType should be set, eg pwrs:Type-$Float32.
! - Attribute should be set to an arbitrary attribute. The only function for the attribute
! is the curve name.
! - ScanTime should be set to the time difference between two samples.
! In the Buffer object, the Size (max number of samples) and ElementSize in bytes should be set.
! To fill in the samples the functions cbuf_AddSample() and cbuf_AddTimeSample() can be used.
! In this example the trend is filled in from a DataArithm where the data buffer is connected
! to Da1 and the time buffer to Da2.
!
! classdef Da1 CircBuff10k;
! classdef Da2 CircBuff20k;
! pwr_tTime time;
!
! time_GetTime(&time);
! cbuf_AddSample(Da1, &A1);
! cbuf_AddTimeSample(Da2, &time);
!
! @b Se also
! @classlink Buff1440 ssab_buff1440.html
! @classlink Buff4096 ssab_buff4096.html
! @classlink Buff32k ssab_buff32k.html
! @classlink DsFastConf pwrb_dsfastconf.html
! @classlink CircBuff10k pwrb_circbuff1k.html
! @classlink CircBuff10k pwrb_circbuff2k.html
! @classlink CircBuff10k pwrb_circbuff10k.html
! @classlink CircBuff10k pwrb_circbuff20k.html
! @classlink CircBuff10k pwrb_circbuff10k.html
! @classlink DsTrendConf pwrb_dstrendconf.html
!*/
Object DsTrendCurve $ClassDef 593
Body SysBody
...
...
@@ -125,6 +148,9 @@ SObject pwrb:Class
EndBody
EndObject
!/**
! The attribute type only has to be set if UserStorage
! is used, where the type is set in the form pwrs:Type-$Float32.
!
! Stores measurants data types. It has to be of any of
! the types pwr_tBoolean, pwr_tFloat32, pwr_tFloat64,
! pwr_tInt8, pwr_tInt16, pwr_tInt32, pwr_tUInt8,
...
...
@@ -133,8 +159,6 @@ SObject pwrb:Class
Object AttributeType $Attribute 5
Body SysBody
Attr TypeRef = "pwrs:Type-$TypeId"
Attr Flags |= PWR_MASK_STATE
Attr Flags |= PWR_MASK_INVISIBLE
Attr Flags |= PWR_MASK_ARRAY
Attr Elements = 10
EndBody
...
...
@@ -152,11 +176,11 @@ SObject pwrb:Class
EndBody
EndObject
!/**
! @Summary Data buffers.
Array attributes
that contains the data of the curves.
!
Data buffers. Array attribute
s that contains the data of the curves.
! @Summary Data buffers.
Circular buffer objects
that contains the data of the curves.
!
Circular buffer object
s that contains the data of the curves.
! Objects for the databuffers has to be configured by the user. The extent of the
! buffer attributes should equal or exceed the storeage size, i.e. the size of the
! sampled attribute's type multiplied by NoOf
Points
.
! sampled attribute's type multiplied by NoOf
Sample
.
!*/
Object Buffers $Attribute 7
Body SysBody
...
...
@@ -166,8 +190,8 @@ SObject pwrb:Class
EndBody
EndObject
!/**
! @Summary Time buffer. A
n array attribute
that contain the time axis data for the curves.
! Time buffer. A
n array attribute
that contain the time axis data for the curves.
! @Summary Time buffer. A
circular buffer object
that contain the time axis data for the curves.
! Time buffer. A
circular buffer object
that contain the time axis data for the curves.
! The object for the time buffer has to be configured by the user. The extent of the
! buffer attributes should equal or exceed the storeage size for the time data.
!*/
...
...
@@ -178,7 +202,7 @@ SObject pwrb:Class
EndObject
!/**
! Resolution of time scale, seconds or nanoseconds.
! Seconds will require 4 bytes per
point, and nanoseconds 8 bytes per point
.
! Seconds will require 4 bytes per
sample, and nanoseconds 8 bytes per sample
.
!*/
Object TimeResolution $Attribute 16
Body SysBody
...
...
wb/exp/wb/src/pwr_wb_palette.cnf
View file @
3e71ab1d
...
...
@@ -68,8 +68,18 @@ palette NavigatorPalette
{
class DsFastCurve
class DsTrend
class DsTrendCurve
class SevHist
class SevHistObject
menu CircularBuffer
{
class CircBuff1k
class CircBuff2k
class CircBuff10k
class CircBuff20k
class CircBuff100k
class CircBuff200k
}
}
menu Supervision
{
...
...
xtt/lib/xtt/src/xtt_trend.cpp
View file @
3e71ab1d
...
...
@@ -42,6 +42,7 @@
#include "pwr.h"
#include "pwr_baseclasses.h"
#include "rt_gdh.h"
#include "rt_cbuf.h"
#include "rt_gdh_msg.h"
#include "co_cdh.h"
#include "co_time.h"
...
...
@@ -314,7 +315,7 @@ XttTrend::XttTrend( void *parent_ctx,
cb_info
[
i
].
bufsize
=
cb_info
[
i
].
samples
*
element_size
[
i
];
cb_info
[
i
].
bufp
=
(
char
*
)
calloc
(
1
,
cb_info
[
i
].
bufsize
);
cb_info
[
i
].
circ_aref
=
tcp
[
tcp_i
].
Buffers
[
j
];
*
sts
=
gdh
_GetCircBuffInfo
(
&
cb_info
[
i
],
1
);
*
sts
=
cbuf
_GetCircBuffInfo
(
&
cb_info
[
i
],
1
);
if
(
EVEN
(
*
sts
))
continue
;
...
...
@@ -521,7 +522,7 @@ void XttTrend::trend_scan( void *data)
pwr_tStatus
sts
;
unsigned
int
size
;
sts
=
gdh
_UpdateCircBuffInfo
(
trend
->
cb_info
,
trend
->
trend_cnt
);
sts
=
cbuf
_UpdateCircBuffInfo
(
trend
->
cb_info
,
trend
->
trend_cnt
);
if
(
EVEN
(
sts
))
return
;
for
(
i
=
0
;
i
<
trend
->
trend_cnt
;
i
++
)
{
...
...
xtt/lib/xtt/src/xtt_trend.h
View file @
3e71ab1d
...
...
@@ -47,6 +47,10 @@
# include "ge_curve.h"
#endif
#ifndef rt_cbuf_h
# include "rt_cbuf.h"
#endif
#define XTT_TREND_MAX 20
class
CoWow
;
...
...
@@ -70,7 +74,7 @@ class XttTrend {
int
max_points
;
pwr_tTid
trend_tid
;
int
update_time
;
gdh
_sCircBuffInfo
cb_info
[
XTT_TREND_MAX
];
cbuf
_sCircBuffInfo
cb_info
[
XTT_TREND_MAX
];
CoWowTimer
*
timerid
;
int
last_buffer
[
XTT_TREND_MAX
];
int
last_next_index
[
XTT_TREND_MAX
];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment