Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
0f0dbfd8
Commit
0f0dbfd8
authored
Feb 20, 2017
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(MBSlave): заложил скелет реализации REST API
parent
8a08d486
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
168 additions
and
2 deletions
+168
-2
MBSlave.cc
extensions/ModbusSlave/MBSlave.cc
+142
-0
MBSlave.h
extensions/ModbusSlave/MBSlave.h
+24
-0
IOController.cc
src/Processes/IOController.cc
+1
-1
IONotifyController.cc
src/Processes/IONotifyController.cc
+1
-1
No files found.
extensions/ModbusSlave/MBSlave.cc
View file @
0f0dbfd8
...
@@ -1504,6 +1504,24 @@ namespace uniset
...
@@ -1504,6 +1504,24 @@ namespace uniset
cout
<<
LogServer
::
help_print
(
"prefix-logserver"
)
<<
endl
;
cout
<<
LogServer
::
help_print
(
"prefix-logserver"
)
<<
endl
;
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
string
MBSlave
::
amode2str
(
MBSlave
::
AccessMode
m
)
{
switch
(
m
)
{
case
amRW
:
return
"rw"
;
case
amRO
:
return
"ro"
;
case
amWO
:
return
"wr"
;
default
:
return
""
;
}
}
// -----------------------------------------------------------------------------
std
::
shared_ptr
<
MBSlave
>
MBSlave
::
init_mbslave
(
int
argc
,
const
char
*
const
*
argv
,
uniset
::
ObjectId
icID
,
std
::
shared_ptr
<
MBSlave
>
MBSlave
::
init_mbslave
(
int
argc
,
const
char
*
const
*
argv
,
uniset
::
ObjectId
icID
,
const
std
::
shared_ptr
<
SharedMemory
>&
ic
,
const
string
&
prefix
)
const
std
::
shared_ptr
<
SharedMemory
>&
ic
,
const
string
&
prefix
)
{
{
...
@@ -1983,6 +2001,129 @@ namespace uniset
...
@@ -1983,6 +2001,129 @@ namespace uniset
pingOK
=
false
;
pingOK
=
false
;
return
ModbusRTU
::
erTimeOut
;
return
ModbusRTU
::
erTimeOut
;
}
}
#ifndef DISABLE_REST_API
// -------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
MBSlave
::
httpHelp
(
const
Poco
::
URI
::
QueryParameters
&
p
)
{
uniset
::
json
::
help
::
object
myhelp
(
myname
,
UniSetObject
::
httpHelp
(
p
));
{
// 'regs'
uniset
::
json
::
help
::
item
cmd
(
"get registers list"
);
cmd
.
param
(
"regs=reg1,reg2,reg3.."
,
"get these registers"
);
cmd
.
param
(
"addr=mbaddr1,mbaddr2,.."
,
"get registers for mbaddr"
);
myhelp
.
add
(
cmd
);
}
return
myhelp
;
}
// -------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
MBSlave
::
httpRequest
(
const
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
p
)
{
if
(
req
==
"regs"
)
return
request_regs
(
req
,
p
);
return
UniSetObject
::
httpRequest
(
req
,
p
);
}
// -------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
MBSlave
::
request_regs
(
const
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
params
)
{
Poco
::
JSON
::
Object
::
Ptr
json
=
new
Poco
::
JSON
::
Object
();
Poco
::
JSON
::
Array
::
Ptr
jdata
=
uniset
::
json
::
make_child_array
(
json
,
"regs"
);
auto
my
=
httpGetMyInfo
(
json
);
auto
oind
=
uniset_conf
()
->
oind
;
std
::
vector
<
std
::
string
>
q_regs
;
std
::
vector
<
std
::
string
>
q_addr
;
if
(
!
params
.
empty
()
)
{
for
(
const
auto
&
p
:
params
)
{
if
(
p
.
first
==
"regs"
)
q_regs
=
uniset
::
explode_str
(
p
.
second
,
','
);
else
if
(
p
.
first
==
"addr"
)
q_addr
=
uniset
::
explode_str
(
p
.
second
,
','
);
}
}
/* Создаём json
* { {"addr":
* {"regs":
* {reginfo..},
* {reginfo..},
* }},
* }
*/
// Проход по списку заданных addr..
if
(
!
q_addr
.
empty
()
)
{
for
(
const
auto
&
a
:
q_addr
)
{
ModbusRTU
::
ModbusAddr
mbaddr
=
ModbusRTU
::
str2mbAddr
(
a
);
auto
i
=
iomap
.
find
(
mbaddr
);
if
(
i
!=
iomap
.
end
()
)
{
Poco
::
JSON
::
Object
::
Ptr
jaddr
=
get_regs
(
i
->
first
,
i
->
second
,
q_regs
);
jdata
->
add
(
jaddr
);
}
}
}
else
// Проход по всему списку
{
for
(
const
auto
&
i
:
iomap
)
{
Poco
::
JSON
::
Object
::
Ptr
jaddr
=
get_regs
(
i
.
first
,
i
.
second
,
q_regs
);
jdata
->
add
(
jaddr
);
}
}
return
json
;
}
// -------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
MBSlave
::
get_regs
(
ModbusRTU
::
ModbusAddr
addr
,
const
RegMap
&
rmap
,
const
std
::
vector
<
string
>&
q_regs
)
{
Poco
::
JSON
::
Object
::
Ptr
jaddr
=
new
Poco
::
JSON
::
Object
();
Poco
::
JSON
::
Array
::
Ptr
regs
=
new
Poco
::
JSON
::
Array
();
jaddr
->
set
(
ModbusRTU
::
addr2str
(
addr
),
regs
);
if
(
q_regs
.
empty
()
)
{
for
(
const
auto
&
r
:
rmap
)
{
Poco
::
JSON
::
Object
::
Ptr
reginfo
=
get_reginfo
(
r
.
second
);
regs
->
add
(
reginfo
);
}
}
else
{
for
(
const
auto
&
s
:
q_regs
)
{
auto
reg
=
genRegID
(
ModbusRTU
::
str2mbData
(
s
),
default_mbfunc
);
auto
r
=
rmap
.
find
(
reg
);
if
(
r
!=
rmap
.
end
()
)
{
Poco
::
JSON
::
Object
::
Ptr
reginfo
=
get_reginfo
(
r
->
second
);
regs
->
add
(
reginfo
);
}
}
}
return
jaddr
;
}
// -------------------------------------------------------------------------
Poco
::
JSON
::
Object
::
Ptr
MBSlave
::
get_reginfo
(
const
IOProperty
&
prop
)
{
Poco
::
JSON
::
Object
::
Ptr
reginfo
=
new
Poco
::
JSON
::
Object
();
reginfo
->
set
(
"mbreg"
,
prop
.
mbreg
);
reginfo
->
set
(
"vtype"
,
VTypes
::
type2str
(
prop
.
vtype
));
reginfo
->
set
(
"regID"
,
prop
.
regID
);
reginfo
->
set
(
"amode"
,
amode2str
(
prop
.
amode
));
reginfo
->
set
(
"value"
,
prop
.
value
);
return
reginfo
;
}
#endif
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
ModbusRTU
::
mbErrCode
MBSlave
::
much_real_read
(
RegMap
&
rmap
,
const
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
ModbusRTU
::
mbErrCode
MBSlave
::
much_real_read
(
RegMap
&
rmap
,
const
ModbusRTU
::
ModbusData
reg
,
ModbusRTU
::
ModbusData
*
dat
,
size_t
count
,
const
int
fn
)
size_t
count
,
const
int
fn
)
...
@@ -2652,6 +2793,7 @@ namespace uniset
...
@@ -2652,6 +2793,7 @@ namespace uniset
i
->
info
=
inf
.
str
().
c_str
();
i
->
info
=
inf
.
str
().
c_str
();
return
i
.
_retn
();
return
i
.
_retn
();
}
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
void
MBSlave
::
initTCPClients
(
UniXML
::
iterator
confnode
)
void
MBSlave
::
initTCPClients
(
UniXML
::
iterator
confnode
)
{
{
...
...
extensions/ModbusSlave/MBSlave.h
View file @
0f0dbfd8
...
@@ -60,6 +60,7 @@ namespace uniset
...
@@ -60,6 +60,7 @@ namespace uniset
- \ref sec_MBSlave_MEIRDI
- \ref sec_MBSlave_MEIRDI
- \ref sec_MBSlave_DIAG
- \ref sec_MBSlave_DIAG
- \ref sec_MBSlave_TCP
- \ref sec_MBSlave_TCP
- \ref sec_MBSlave_REST_API
\section sec_MBSlave_Comm Общее описание Modbus slave
\section sec_MBSlave_Comm Общее описание Modbus slave
Класс реализует базовые функции для протокола Modbus в slave режиме. Реализацию Modbus RTU - см. RTUExchange.
Класс реализует базовые функции для протокола Modbus в slave режиме. Реализацию Modbus RTU - см. RTUExchange.
...
@@ -303,6 +304,15 @@ namespace uniset
...
@@ -303,6 +304,15 @@ namespace uniset
</MBTCPPersistentSlave>
</MBTCPPersistentSlave>
\endcode
\endcode
\section sec_MBSlave_REST_API MBSlave HTTP API
/help - Получение списка доступных команд
/ - получение стандартной информации
/regs?regs=reg1,reg2,reg3,..&addr=addr1,addr2,addr3 - получение списка регистров
Не обязательные параметры:
regs - выдать информацию только по указанным регистрам
addr - выдать информацию только по указанным адресам устройств
*/
*/
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
/*! Реализация slave-интерфейса */
/*! Реализация slave-интерфейса */
...
@@ -330,6 +340,8 @@ namespace uniset
...
@@ -330,6 +340,8 @@ namespace uniset
amWO
amWO
};
};
std
::
string
amode2str
(
AccessMode
m
);
struct
BitRegProperty
;
struct
BitRegProperty
;
struct
IOProperty
:
struct
IOProperty
:
...
@@ -388,6 +400,12 @@ namespace uniset
...
@@ -388,6 +400,12 @@ namespace uniset
virtual
uniset
::
SimpleInfo
*
getInfo
(
const
char
*
userparam
=
0
)
override
;
virtual
uniset
::
SimpleInfo
*
getInfo
(
const
char
*
userparam
=
0
)
override
;
#ifndef DISABLE_REST_API
// http API
virtual
Poco
::
JSON
::
Object
::
Ptr
httpHelp
(
const
Poco
::
URI
::
QueryParameters
&
p
)
override
;
virtual
Poco
::
JSON
::
Object
::
Ptr
httpRequest
(
const
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
p
)
override
;
#endif
protected
:
protected
:
/*! обработка 0x01 */
/*! обработка 0x01 */
...
@@ -514,6 +532,12 @@ namespace uniset
...
@@ -514,6 +532,12 @@ namespace uniset
ModbusRTU
::
mbErrCode
real_bitreg_write_it
(
std
::
shared_ptr
<
BitRegProperty
>&
bp
,
const
ModbusRTU
::
ModbusData
val
);
ModbusRTU
::
mbErrCode
real_bitreg_write_it
(
std
::
shared_ptr
<
BitRegProperty
>&
bp
,
const
ModbusRTU
::
ModbusData
val
);
ModbusRTU
::
mbErrCode
real_write_prop
(
IOProperty
*
p
,
ModbusRTU
::
ModbusData
*
dat
,
size_t
&
i
,
size_t
count
);
ModbusRTU
::
mbErrCode
real_write_prop
(
IOProperty
*
p
,
ModbusRTU
::
ModbusData
*
dat
,
size_t
&
i
,
size_t
count
);
#ifndef DISABLE_REST_API
// http api
Poco
::
JSON
::
Object
::
Ptr
request_regs
(
const
std
::
string
&
req
,
const
Poco
::
URI
::
QueryParameters
&
p
);
Poco
::
JSON
::
Object
::
Ptr
get_regs
(
ModbusRTU
::
ModbusAddr
addr
,
const
RegMap
&
rmap
,
const
std
::
vector
<
std
::
string
>&
q_regs
);
Poco
::
JSON
::
Object
::
Ptr
get_reginfo
(
const
IOProperty
&
prop
);
#endif
MBSlave
();
MBSlave
();
timeout_t
initPause
=
{
3000
};
timeout_t
initPause
=
{
3000
};
uniset
::
uniset_rwmutex
mutex_start
;
uniset
::
uniset_rwmutex
mutex_start
;
...
...
src/Processes/IOController.cc
View file @
0f0dbfd8
...
@@ -858,7 +858,7 @@ Poco::JSON::Object::Ptr IOController::httpHelp( const Poco::URI::QueryParameters
...
@@ -858,7 +858,7 @@ Poco::JSON::Object::Ptr IOController::httpHelp( const Poco::URI::QueryParameters
{
{
// 'sensors'
// 'sensors'
uniset
::
json
::
help
::
item
cmd
(
"et all sensors"
);
uniset
::
json
::
help
::
item
cmd
(
"
g
et all sensors"
);
cmd
.
param
(
"nameonly"
,
"get only name sensors"
);
cmd
.
param
(
"nameonly"
,
"get only name sensors"
);
cmd
.
param
(
"offset=N"
,
"get from N record"
);
cmd
.
param
(
"offset=N"
,
"get from N record"
);
cmd
.
param
(
"limit=M"
,
"limit of records"
);
cmd
.
param
(
"limit=M"
,
"limit of records"
);
...
...
src/Processes/IONotifyController.cc
View file @
0f0dbfd8
...
@@ -1223,7 +1223,7 @@ Poco::JSON::Object::Ptr IONotifyController::request_consumers( const string& req
...
@@ -1223,7 +1223,7 @@ Poco::JSON::Object::Ptr IONotifyController::request_consumers( const string& req
ConsumerListInfo
emptyList
;
ConsumerListInfo
emptyList
;
if
(
p
.
size
()
>
0
)
if
(
!
p
.
empty
()
)
{
{
if
(
!
p
[
0
].
first
.
empty
()
)
if
(
!
p
[
0
].
first
.
empty
()
)
slist
=
uniset
::
getSInfoList
(
p
[
0
].
first
,
uniset_conf
()
);
slist
=
uniset
::
getSInfoList
(
p
[
0
].
first
,
uniset_conf
()
);
...
...
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