Skip to content

Commit

Permalink
* Use wait mode for all set operations (#43)
Browse files Browse the repository at this point in the history
* Add output of execution time
* Update version number
  • Loading branch information
Feilner authored Sep 12, 2023
1 parent 45c7a42 commit 5d7e301
Show file tree
Hide file tree
Showing 4 changed files with 129 additions and 131 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

## [1.0.40] 2023-09-12
### Fixed
- Data corruption during multiple SET operations e.g. close all blinds
- Synchronous execution of SET oparations

## [1.0.39] 2022-09-28
### Fixed
- Possible buffer overwrite by using separate buffer for each set operation
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2020 Feilner
Copyright (c) 2023 Feilner

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
251 changes: 122 additions & 129 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* (c) 2020-2022 Feilner
* (c) 2020-2023 Feilner
*/

var PlatformAccessory, Service, Characteristic, UUIDGen;
Expand Down Expand Up @@ -2996,23 +2996,21 @@ GenericPLCAccessory.prototype = {

//ensure PLC connection
if (this.platform.S7ClientConnect()) {

buf.writeUInt8(1);
S7Client.WriteArea(S7Client.S7AreaDB, db, ((offset*8) + bit), 1, S7Client.S7WLBit, buf, function(err) {
if(err) {
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
log.debug(logprefix , String(value));
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
});
if (!S7Client.WriteArea(S7Client.S7AreaDB, db, ((offset*8) + bit), 1, S7Client.S7WLBit, buf)) {
var err = S7Client.LastError();
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
log.debug(logprefix + " %d ms", String(value), S7Client.ExecTime());
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
}
else {
callback(new Error('PLC not connected'), false);
Expand All @@ -3035,28 +3033,27 @@ GenericPLCAccessory.prototype = {
//ensure PLC connection
if (this.platform.S7ClientConnect()) {
buf.writeInt8(valuePLC ? 1 : 0);
S7Client.WriteArea(S7Client.S7AreaDB, db, ((offset*8) + bit), 1, S7Client.S7WLBit, buf, function(err) {
if(err) {
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
if (!S7Client.WriteArea(S7Client.S7AreaDB, db, ((offset*8) + bit), 1, S7Client.S7WLBit, buf)) {
var err = S7Client.LastError();
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix + " %d ms", String(value) + "->" + String(valuePLC), S7Client.ExecTime());
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix , String(value) + "->" + String(valuePLC));
}
else
{
log.debug(logprefix , String(value));
}
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
else
{
log.debug(logprefix + " %d ms", String(value), S7Client.ExecTime());
}
});
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
}
else {
callback(new Error('PLC not connected'), false);
Expand Down Expand Up @@ -3118,29 +3115,28 @@ GenericPLCAccessory.prototype = {

//ensure PLC connection
if (this.platform.S7ClientConnect()) {
buf.writeFloatBE(valuePLC);
S7Client.WriteArea(S7Client.S7AreaDB, db, offset, 1, S7Client.S7WLReal, buf, function(err) {
if(err) {
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix , String(value) + "->" + String(valuePLC));
}
else
{
log.debug(logprefix , String(value));
}
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
});
buf.writeFloatBE(valuePLC);
if (!S7Client.WriteArea(S7Client.S7AreaDB, db, offset, 1, S7Client.S7WLReal, buf)) {
var err = S7Client.LastError();
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix + " %d ms", String(value) + "->" + String(valuePLC), S7Client.ExecTime());
}
else
{
log.debug(logprefix + " %d ms", String(value), S7Client.ExecTime());
}
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
}
else {
callback(new Error('PLC not connected'));
Expand Down Expand Up @@ -3202,29 +3198,28 @@ GenericPLCAccessory.prototype = {

//ensure PLC connection
if (this.platform.S7ClientConnect()) {
buf.writeUInt8(valuePLC);
S7Client.WriteArea(S7Client.S7AreaDB, db, offset, 1, S7Client.S7WLByte, buf, function(err) {
if(err) {
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix , String(value) + "->" + String(valuePLC));
}
else
{
log.debug(logprefix , String(value));
}
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
});
buf.writeUInt8(valuePLC);
if (!S7Client.WriteArea(S7Client.S7AreaDB, db, offset, 1, S7Client.S7WLByte, buf)) {
var err = S7Client.LastError();
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix , String(value) + "->" + String(valuePLC));
}
else
{
log.debug(logprefix , String(value));
}
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
}
else {
callback(new Error('PLC not connected'));
Expand Down Expand Up @@ -3285,29 +3280,28 @@ GenericPLCAccessory.prototype = {

//ensure PLC connection
if (this.platform.S7ClientConnect()) {
buf.writeInt16BE(valuePLC);
S7Client.WriteArea(S7Client.S7AreaDB, db, offset, 1, S7Client.S7WLWord, buf, function(err) {
if(err) {
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix , String(value) + "->" + String(valuePLC));
}
else
{
log.debug(logprefix , String(value));
}
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
});
buf.writeInt16BE(valuePLC);
if (!S7Client.WriteArea(S7Client.S7AreaDB, db, offset, 1, S7Client.S7WLWord, buf)) {
var err = S7Client.LastError();
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix + " %d ms", String(value) + "->" + String(valuePLC)), S7Client.ExecTime();
}
else
{
log.debug(logprefix + " %d ms", String(value), S7Client.ExecTime());
}
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
}
else {
callback(new Error('PLC not connected'));
Expand Down Expand Up @@ -3371,29 +3365,28 @@ GenericPLCAccessory.prototype = {

//ensure PLC connection
if (this.platform.S7ClientConnect()) {
buf.writeInt32BE(valuePLC);
S7Client.WriteArea(S7Client.S7AreaDB, db, offset, 1, S7Client.S7WLDWord, buf, function(err) {
if(err) {
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix , String(value) + "->" + String(valuePLC));
}
else
{
log.debug(logprefix , String(value));
}
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
});
buf.writeInt32BE(valuePLC);
if (!S7Client.WriteArea(S7Client.S7AreaDB, db, offset, 1, S7Client.S7WLDWord, buf)) {
var err = S7Client.LastError();
log.error(logprefix, "WriteArea failed #" + err.toString(16) + " - " + S7Client.ErrorText(err));
if(err & 0xFFFFF) {S7Client.Disconnect();}
callback(new Error('PLC error'));
}
else {
if (typeof(valueMod) != 'undefined' && valueMod)
{
log.debug(logprefix + " %d ms", String(value) + "->" + String(valuePLC), S7Client.ExecTime());
}
else
{
log.debug(logprefix + " %d ms", String(value), S7Client.ExecTime());
}
callback(null);
if (typeof(inform) != 'undefined' && inform)
{
inform(value);
}
}
}
else {
callback(new Error('PLC not connected'));
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "homebridge-plc",
"version": "1.0.39",
"version": "1.0.40",
"description": "Homebridge plugin for Siemens Step7 and compatible PLCs. (https://github.com/homebridge)",
"license": "MIT",
"keywords": [
Expand Down

0 comments on commit 5d7e301

Please sign in to comment.