mirror of
https://github.com/thiagoralves/OpenPLC_v3.git
synced 2026-09-24 15:44:29 +08:00
Merge branch 'thiagoralves:master' into long_long_sleep
This commit is contained in:
+2
-2
@@ -1,6 +1,6 @@
|
||||
FROM debian
|
||||
FROM debian:bullseye-20211201
|
||||
|
||||
COPY . /workdir
|
||||
RUN cd /workdir && ./install.sh docker
|
||||
WORKDIR /workdir
|
||||
RUN ./install.sh docker
|
||||
ENTRYPOINT ["./start_openplc.sh"]
|
||||
|
||||
+54
-9
@@ -21,10 +21,32 @@ fi
|
||||
#set -x
|
||||
# arg1: sudo or blank
|
||||
function linux_install_deps {
|
||||
$1 apt-get update
|
||||
$1 apt-get install -y build-essential pkg-config bison flex autoconf \
|
||||
automake libtool make git python2.7 \
|
||||
sqlite3 cmake git curl python3
|
||||
#Detecting OS type
|
||||
INSTALLER=""
|
||||
OS=$(awk '/NAME=/' /etc/*-release | sed -n '1 p' | cut -d= -f2 | cut -d\" -f2 | cut -d" " -f1)
|
||||
|
||||
if [ "$OS" = "Fedora" ]; then
|
||||
INSTALLER="yum"
|
||||
elif [ "$OS" = "CentOS" ]; then
|
||||
INSTALLER="yum"
|
||||
elif [ "$OS" = "Red" ]; then
|
||||
INSTALLER="yum"
|
||||
else
|
||||
INSTALLER="apt"
|
||||
fi
|
||||
|
||||
if [ "$INSTALLER" = "yum" ]; then
|
||||
yum clean expire-cache
|
||||
yum check-update
|
||||
$1 yum -q -y install curl make automake gcc gcc-c++ kernel-devel pkg-config bison flex autoconf libtool openssl-devel cmake python3 python3-pip
|
||||
$1 yum -q -y install python2.7 python2-devel
|
||||
#Installing dependencies for Ubuntu/Mint/Debian
|
||||
else
|
||||
$1 apt-get update
|
||||
$1 apt-get install -y build-essential pkg-config bison flex autoconf \
|
||||
automake libtool make git python2.7 \
|
||||
sqlite3 cmake git curl python3 python3-pip
|
||||
fi
|
||||
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
|
||||
$1 python2.7 get-pip.py
|
||||
}
|
||||
@@ -142,15 +164,18 @@ WantedBy=multi-user.target" >> openplc.service
|
||||
if [ "$1" == "win" ]; then
|
||||
echo "Installing OpenPLC on Windows"
|
||||
cp ./utils/apt-cyg/apt-cyg ./
|
||||
cp ./utils/apt-cyg/wget.exe /bin
|
||||
if [ -f "/usr/bin/wget" ]
|
||||
then
|
||||
echo "found wget. Skipping install"
|
||||
else
|
||||
echo "wget not found. Installing from binary"
|
||||
cp ./utils/apt-cyg/wget.exe /bin
|
||||
fi
|
||||
install apt-cyg /bin
|
||||
apt-cyg update
|
||||
# replace cygwin installed database to avoid installation errors
|
||||
cp ./installed.db /etc/setup/installed.db
|
||||
apt-cyg install lynx
|
||||
rm -f /bin/wget.exe
|
||||
# apt-cyg remove gcc-core gcc-g++ pkg-config automake autoconf libtool make python2 python2-pip sqlite3
|
||||
apt-cyg install wget gcc-core gcc-g++ git pkg-config automake autoconf libtool make python2 python2-pip sqlite3 python3
|
||||
apt-cyg install gcc-core gcc-g++ git pkg-config automake autoconf libtool make python2 python2-pip sqlite3 python3
|
||||
lynx -source https://bootstrap.pypa.io/pip/2.7/get-pip.py > get-pip.py
|
||||
lynx -source https://bootstrap.pypa.io/pip/get-pip.py > get-pip3.py
|
||||
/usr/bin/python2 get-pip.py
|
||||
@@ -244,7 +269,27 @@ elif [ "$1" == "linux" ]; then
|
||||
install_py_deps "sudo -H"
|
||||
|
||||
install_all_libs sudo
|
||||
|
||||
#Detecting OS type
|
||||
OS_TYPE=""
|
||||
OS=$(awk '/NAME=/' /etc/*-release | sed -n '1 p' | cut -d= -f2 | cut -d\" -f2 | cut -d" " -f1)
|
||||
|
||||
if [ "$OS" = "Fedora" ]; then
|
||||
OS_TYPE="yum"
|
||||
elif [ "$OS" = "CentOS" ]; then
|
||||
OS_TYPE="yum"
|
||||
elif [ "$OS" = "Red" ]; then
|
||||
OS_TYPE="yum"
|
||||
else
|
||||
OS_TYPE="apt"
|
||||
fi
|
||||
|
||||
#Fix for Fedora
|
||||
if [ "$OS_TYPE" = "yum" ]; then
|
||||
sudo cp /usr/local/lib/pkgconfig/libmodbus.pc /usr/share/pkgconfig/
|
||||
sudo cp /usr/local/lib/lib*.* /lib64/
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "[FINALIZING]"
|
||||
cd webserver/scripts
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
|
||||
#define MAX_LINE_INPUT 1024
|
||||
#define MAX_LOCAL_BUFFER 100
|
||||
|
||||
using namespace std;
|
||||
|
||||
/// Write the header to the output stream. The header is common among all glueVars files.
|
||||
@@ -79,28 +82,34 @@ void glueVars()\r\n\
|
||||
int parseIecVars(istream& locatedVars, char *varName, char *varType)
|
||||
{
|
||||
string line;
|
||||
char buffer[1024];
|
||||
char buffer[MAX_LINE_INPUT];
|
||||
|
||||
if (getline(locatedVars, line))
|
||||
{
|
||||
int i = 0, j = 0;
|
||||
strncpy(buffer, line.c_str(), 1024);
|
||||
for (i = 0; buffer[i] != '('; i++);
|
||||
strncpy(buffer, line.c_str(), MAX_LINE_INPUT);
|
||||
for (i = 0; i < MAX_LINE_INPUT && buffer[i] != '('; i++);
|
||||
i++;
|
||||
|
||||
while (buffer[i] != ',')
|
||||
while (i < MAX_LINE_INPUT && buffer[i] != ',')
|
||||
{
|
||||
varType[j] = buffer[i];
|
||||
i++; j++;
|
||||
varType[j] = '\0';
|
||||
if(j < MAX_LOCAL_BUFFER)
|
||||
{
|
||||
varType[j] = buffer[i];
|
||||
i++; j++;
|
||||
varType[j] = '\0';
|
||||
}
|
||||
}
|
||||
i++; j=0;
|
||||
|
||||
while (buffer[i] != ',')
|
||||
while (i < MAX_LINE_INPUT && buffer[i] != ',')
|
||||
{
|
||||
varName[j] = buffer[i];
|
||||
i++; j++;
|
||||
varName[j] = '\0';
|
||||
if(j < MAX_LOCAL_BUFFER)
|
||||
{
|
||||
varName[j] = buffer[i];
|
||||
i++; j++;
|
||||
varName[j] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
@@ -69,6 +69,7 @@ struct MB_device
|
||||
char rtu_parity;
|
||||
int rtu_data_bit;
|
||||
int rtu_stop_bit;
|
||||
int rtu_tx_pause;
|
||||
uint8_t dev_id;
|
||||
bool isConnected;
|
||||
|
||||
@@ -166,7 +167,8 @@ void parseConfig()
|
||||
char temp_buffer[5];
|
||||
getData(line_str, temp_buffer, '"', '"');
|
||||
num_devices = atoi(temp_buffer);
|
||||
mb_devices = (struct MB_device *)malloc(num_devices*sizeof(struct MB_device));
|
||||
//initializes the allocated memory to zero
|
||||
mb_devices = calloc(num_devices, sizeof(struct MB_device));
|
||||
}
|
||||
else if (!strncmp(line_str, "Polling_Period", 14))
|
||||
{
|
||||
@@ -241,6 +243,12 @@ void parseConfig()
|
||||
getData(line_str, temp_buffer, '"', '"');
|
||||
mb_devices[deviceNumber].rtu_stop_bit = atoi(temp_buffer);
|
||||
}
|
||||
else if (!strncmp(functionType, "RTU_TX_Pause", 12))
|
||||
{
|
||||
char temp_buffer[10];
|
||||
getData(line_str, temp_buffer, '"', '"');
|
||||
mb_devices[deviceNumber].rtu_tx_pause = atoi(temp_buffer);
|
||||
}
|
||||
else if (!strncmp(functionType, "Discrete_Inputs_Start", 21))
|
||||
{
|
||||
char temp_buffer[10];
|
||||
@@ -355,30 +363,31 @@ void *querySlaveDevices(void *arg)
|
||||
|
||||
for (int i = 0; i < num_devices; i++)
|
||||
{
|
||||
//Check if there is a device using the same port
|
||||
//Check if there is a connected RTU device using the same port
|
||||
bool found_sharing = false;
|
||||
for (int a = 0; a < num_devices; a++)
|
||||
bool rtu_port_connected = false;
|
||||
if (mb_devices[i].protocol == MB_RTU)
|
||||
{
|
||||
if (a != i && !strcmp(mb_devices[i].dev_address, mb_devices[a].dev_address))
|
||||
for (int a = 0; a < num_devices; a++)
|
||||
{
|
||||
found_sharing = true;
|
||||
if (mb_devices[i].isConnected == false && mb_devices[a].isConnected == true)
|
||||
if (a != i && !strcmp(mb_devices[i].dev_address, mb_devices[a].dev_address))
|
||||
{
|
||||
mb_devices[i].mb_ctx = mb_devices[a].mb_ctx;
|
||||
sprintf(log_msg, "Connected to MB device %s\n", mb_devices[i].dev_name);
|
||||
log(log_msg);
|
||||
mb_devices[i].isConnected = true;
|
||||
found_sharing = true;
|
||||
if (mb_devices[a].isConnected)
|
||||
{
|
||||
rtu_port_connected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found_sharing)
|
||||
{
|
||||
//Must reset mb context to current device's slave id
|
||||
modbus_set_slave(mb_devices[i].mb_ctx, mb_devices[i].dev_id);
|
||||
if (found_sharing)
|
||||
{
|
||||
//Must reset mb context to current device's slave id
|
||||
modbus_set_slave(mb_devices[i].mb_ctx, mb_devices[i].dev_id);
|
||||
}
|
||||
}
|
||||
|
||||
//Verify if device is connected
|
||||
if (!mb_devices[i].isConnected)
|
||||
if (!mb_devices[i].isConnected && !rtu_port_connected)
|
||||
{
|
||||
sprintf(log_msg, "Device %s is disconnected. Attempting to reconnect...\n", mb_devices[i].dev_name);
|
||||
log(log_msg);
|
||||
@@ -404,16 +413,24 @@ void *querySlaveDevices(void *arg)
|
||||
mb_devices[i].isConnected = true;
|
||||
}
|
||||
}
|
||||
if (mb_devices[i].isConnected)
|
||||
if (mb_devices[i].isConnected || rtu_port_connected)
|
||||
{
|
||||
|
||||
struct timespec ts;
|
||||
ts.tv_sec = 0;
|
||||
ts.tv_nsec = (1000*1000*1000*28)/mb_devices[i].rtu_baud;
|
||||
if (mb_devices[i].protocol == MB_RTU)
|
||||
{
|
||||
ts.tv_nsec = (1000*1000*1000*28)/mb_devices[i].rtu_baud;
|
||||
}
|
||||
else
|
||||
{
|
||||
ts.tv_nsec = 0;
|
||||
}
|
||||
|
||||
//Read discrete inputs
|
||||
if (mb_devices[i].discrete_inputs.num_regs != 0)
|
||||
{
|
||||
sleepms(mb_devices[i].rtu_tx_pause);
|
||||
uint8_t *tempBuff;
|
||||
tempBuff = (uint8_t *)malloc(mb_devices[i].discrete_inputs.num_regs);
|
||||
nanosleep(&ts, NULL);
|
||||
@@ -449,6 +466,7 @@ void *querySlaveDevices(void *arg)
|
||||
//Write coils
|
||||
if (mb_devices[i].coils.num_regs != 0)
|
||||
{
|
||||
sleepms(mb_devices[i].rtu_tx_pause);
|
||||
uint8_t *tempBuff;
|
||||
tempBuff = (uint8_t *)malloc(mb_devices[i].coils.num_regs);
|
||||
|
||||
@@ -481,7 +499,7 @@ void *querySlaveDevices(void *arg)
|
||||
//Read input registers
|
||||
if (mb_devices[i].input_registers.num_regs != 0)
|
||||
{
|
||||
|
||||
sleepms(mb_devices[i].rtu_tx_pause);
|
||||
uint16_t *tempBuff;
|
||||
tempBuff = (uint16_t *)malloc(2*mb_devices[i].input_registers.num_regs);
|
||||
nanosleep(&ts, NULL);
|
||||
@@ -517,6 +535,7 @@ void *querySlaveDevices(void *arg)
|
||||
//Read holding registers
|
||||
if (mb_devices[i].holding_read_registers.num_regs != 0)
|
||||
{
|
||||
sleepms(mb_devices[i].rtu_tx_pause);
|
||||
uint16_t *tempBuff;
|
||||
tempBuff = (uint16_t *)malloc(2*mb_devices[i].holding_read_registers.num_regs);
|
||||
nanosleep(&ts, NULL);
|
||||
@@ -551,6 +570,7 @@ void *querySlaveDevices(void *arg)
|
||||
//Write holding registers
|
||||
if (mb_devices[i].holding_registers.num_regs != 0)
|
||||
{
|
||||
sleepms(mb_devices[i].rtu_tx_pause);
|
||||
uint16_t *tempBuff;
|
||||
tempBuff = (uint16_t *)malloc(2*mb_devices[i].holding_registers.num_regs);
|
||||
|
||||
@@ -602,10 +622,33 @@ void initializeMB()
|
||||
}
|
||||
else if (mb_devices[i].protocol == MB_RTU)
|
||||
{
|
||||
mb_devices[i].mb_ctx = modbus_new_rtu( mb_devices[i].dev_address, mb_devices[i].rtu_baud,
|
||||
mb_devices[i].rtu_parity, mb_devices[i].rtu_data_bit,
|
||||
mb_devices[i].rtu_stop_bit);
|
||||
|
||||
//Check if there is a device using the same port
|
||||
int share_index = -1;
|
||||
for (int a = 0; a < num_devices && a < i; a++)
|
||||
{
|
||||
if (strcmp(mb_devices[i].dev_address, mb_devices[a].dev_address) == 0)
|
||||
{
|
||||
share_index = a;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (share_index != -1)
|
||||
{
|
||||
if (mb_devices[i].rtu_baud != mb_devices[share_index].rtu_baud || mb_devices[i].rtu_parity != mb_devices[share_index].rtu_parity ||
|
||||
mb_devices[i].rtu_data_bit != mb_devices[share_index].rtu_data_bit || mb_devices[i].rtu_stop_bit != mb_devices[share_index].rtu_stop_bit)
|
||||
{
|
||||
unsigned char log_msg[1000];
|
||||
sprintf(log_msg, "Warning MB device %s port setting missmatch\n", mb_devices[i].dev_name);
|
||||
log(log_msg);
|
||||
}
|
||||
mb_devices[i].mb_ctx = mb_devices[share_index].mb_ctx;
|
||||
}
|
||||
else
|
||||
{
|
||||
mb_devices[i].mb_ctx = modbus_new_rtu(mb_devices[i].dev_address, mb_devices[i].rtu_baud,
|
||||
mb_devices[i].rtu_parity, mb_devices[i].rtu_data_bit,
|
||||
mb_devices[i].rtu_stop_bit);
|
||||
}
|
||||
}
|
||||
|
||||
//slave id
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
|
||||
#include "ladder.h"
|
||||
|
||||
uint8_t pstorage_read = false;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Main function for the thread. Should create a buffer for the persistent
|
||||
// data, compare it with the actual data and write back to the persistent
|
||||
@@ -34,16 +36,20 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
void startPstorage()
|
||||
{
|
||||
//We can only start persistent storage after the persistent.file was read
|
||||
while (pstorage_read == false)
|
||||
sleepms(100);
|
||||
|
||||
unsigned char log_msg[1000];
|
||||
IEC_UINT persistentBuffer[BUFFER_SIZE];
|
||||
IEC_UINT persistentBuffer[BUFFER_SIZE];
|
||||
|
||||
//Read initial buffers into persistent struct
|
||||
pthread_mutex_lock(&bufferLock); //lock mutex
|
||||
for (int i = 0; i < BUFFER_SIZE; i++)
|
||||
{
|
||||
if (int_memory[i] != NULL) persistentBuffer[i] = *int_memory[i];
|
||||
}
|
||||
pthread_mutex_unlock(&bufferLock); //unlock mutex
|
||||
pthread_mutex_lock(&bufferLock); //lock mutex
|
||||
for (int i = 0; i < BUFFER_SIZE; i++)
|
||||
{
|
||||
if (int_memory[i] != NULL) persistentBuffer[i] = *int_memory[i];
|
||||
}
|
||||
pthread_mutex_unlock(&bufferLock); //unlock mutex
|
||||
|
||||
//Perform the first write
|
||||
if (access("persistent.file", F_OK) == -1)
|
||||
@@ -69,47 +75,47 @@ void startPstorage()
|
||||
fclose(ps);
|
||||
|
||||
//Run the main thread
|
||||
while (run_pstorage)
|
||||
{
|
||||
while (run_pstorage)
|
||||
{
|
||||
|
||||
//Verify if persistent buffer is outdated
|
||||
bool bufferOutdated = false;
|
||||
pthread_mutex_lock(&bufferLock); //lock mutex
|
||||
for (int i = 0; i < BUFFER_SIZE; i++)
|
||||
{
|
||||
if (int_memory[i] != NULL)
|
||||
{
|
||||
if (persistentBuffer[i] != *int_memory[i])
|
||||
{
|
||||
persistentBuffer[i] = *int_memory[i];
|
||||
bufferOutdated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&bufferLock); //unlock mutex
|
||||
bool bufferOutdated = false;
|
||||
pthread_mutex_lock(&bufferLock); //lock mutex
|
||||
for (int i = 0; i < BUFFER_SIZE; i++)
|
||||
{
|
||||
if (int_memory[i] != NULL)
|
||||
{
|
||||
if (persistentBuffer[i] != *int_memory[i])
|
||||
{
|
||||
persistentBuffer[i] = *int_memory[i];
|
||||
bufferOutdated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&bufferLock); //unlock mutex
|
||||
|
||||
//If buffer is outdated, write the changes back to the file
|
||||
if (bufferOutdated)
|
||||
{
|
||||
FILE *fd = fopen("persistent.file", "w"); //if file already exists, it will be overwritten
|
||||
if (fd == NULL)
|
||||
{
|
||||
if (bufferOutdated)
|
||||
{
|
||||
FILE *fd = fopen("persistent.file", "w"); //if file already exists, it will be overwritten
|
||||
if (fd == NULL)
|
||||
{
|
||||
sprintf(log_msg, "Persistent Storage: Error creating persistent memory file!\n");
|
||||
log(log_msg);
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fwrite(persistentBuffer, sizeof(IEC_INT), BUFFER_SIZE, fd) < BUFFER_SIZE)
|
||||
{
|
||||
if (fwrite(persistentBuffer, sizeof(IEC_INT), BUFFER_SIZE, fd) < BUFFER_SIZE)
|
||||
{
|
||||
sprintf(log_msg, "Persistent Storage: Error writing to persistent memory file!\n");
|
||||
log(log_msg);
|
||||
return 0;
|
||||
}
|
||||
fclose(fd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
fclose(fd);
|
||||
}
|
||||
|
||||
sleepms(pstorage_polling*1000);
|
||||
}
|
||||
sleepms(pstorage_polling*1000);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -121,31 +127,35 @@ void startPstorage()
|
||||
int readPersistentStorage()
|
||||
{
|
||||
unsigned char log_msg[1000];
|
||||
FILE *fd = fopen("persistent.file", "r");
|
||||
if (fd == NULL)
|
||||
{
|
||||
FILE *fd = fopen("persistent.file", "r");
|
||||
if (fd == NULL)
|
||||
{
|
||||
sprintf(log_msg, "Warning: Persistent Storage file not found\n");
|
||||
log(log_msg);
|
||||
return 0;
|
||||
}
|
||||
pstorage_read = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
IEC_INT persistentBuffer[BUFFER_SIZE];
|
||||
IEC_INT persistentBuffer[BUFFER_SIZE];
|
||||
|
||||
if (fread(persistentBuffer, sizeof(IEC_INT), BUFFER_SIZE, fd) < BUFFER_SIZE)
|
||||
{
|
||||
if (fread(persistentBuffer, sizeof(IEC_INT), BUFFER_SIZE, fd) < BUFFER_SIZE)
|
||||
{
|
||||
sprintf(log_msg, "Persistent Storage: Error while trying to read persistent.file!\n");
|
||||
log(log_msg);
|
||||
return 0;
|
||||
}
|
||||
fclose(fd);
|
||||
pstorage_read = true;
|
||||
return 0;
|
||||
}
|
||||
fclose(fd);
|
||||
|
||||
sprintf(log_msg, "Persistent Storage: Reading persistent.file into local buffers\n");
|
||||
log(log_msg);
|
||||
|
||||
pthread_mutex_lock(&bufferLock); //lock mutex
|
||||
for (int i = 0; i < BUFFER_SIZE; i++)
|
||||
{
|
||||
if (int_memory[i] != NULL) *int_memory[i] = persistentBuffer[i];
|
||||
}
|
||||
pthread_mutex_unlock(&bufferLock); //unlock mutex
|
||||
}
|
||||
pthread_mutex_lock(&bufferLock); //lock mutex
|
||||
for (int i = 0; i < BUFFER_SIZE; i++)
|
||||
{
|
||||
if (int_memory[i] != NULL) *int_memory[i] = persistentBuffer[i];
|
||||
}
|
||||
pthread_mutex_unlock(&bufferLock); //unlock mutex
|
||||
|
||||
pstorage_read = true;
|
||||
}
|
||||
|
||||
Binary file not shown.
+23
-2
@@ -1487,9 +1487,11 @@ add_slave_devices_tail = """
|
||||
<input type='text' id='dev_data' name='device_data' placeholder='8'>
|
||||
<label for='dev_stop'><b>Stop Bits</b></label>
|
||||
<input type='text' id='dev_stop' name='device_stop' placeholder='1'>
|
||||
<label for='dev_pause'><b>Transmission Pause</b></label>
|
||||
<input type='text' id='dev_pause' name='device_pause' placeholder='0'>
|
||||
</div>
|
||||
</div>
|
||||
<div style="float:right; width:45%; height:730px">
|
||||
<div style="float:right; width:45%; height:780px">
|
||||
<p style='font-size:20px; margin-top:0px'><b>Discrete Inputs (%IX100.0)</b></p>
|
||||
<label for='di_start'><b>Start Address:</b></label>
|
||||
<input type='text' style='width: 20%' id='di_start' name='di_start' placeholder='0'>
|
||||
@@ -1564,6 +1566,7 @@ add_devices_script = """
|
||||
var devparity = document.getElementById("dev_parity");
|
||||
var devdata = document.getElementById("dev_data");
|
||||
var devstop = document.getElementById("dev_stop");
|
||||
var devpause = document.getElementById("dev_pause");
|
||||
|
||||
var distart = document.getElementById("di_start");
|
||||
var disize = document.getElementById("di_size");
|
||||
@@ -1666,6 +1669,8 @@ add_devices_script = """
|
||||
devparity.value = "None"
|
||||
turnElementOn(devdata)
|
||||
turnElementOn(devstop)
|
||||
turnElementOn(devpause)
|
||||
devpause.value = "0"
|
||||
turnElementOn(distart)
|
||||
turnElementOn(disize)
|
||||
turnElementOn(dostart)
|
||||
@@ -1692,6 +1697,8 @@ add_devices_script = """
|
||||
devdata.value = "8"
|
||||
turnElementOff(devstop)
|
||||
devstop.value = "1"
|
||||
turnElementOff(devpause)
|
||||
devpause.value = "0"
|
||||
turnElementOff(distart)
|
||||
distart.value = "0"
|
||||
turnElementOff(disize)
|
||||
@@ -1728,6 +1735,8 @@ add_devices_script = """
|
||||
devdata.value = "8"
|
||||
turnElementOff(devstop)
|
||||
devstop.value = "1"
|
||||
turnElementOff(devpause)
|
||||
devpause.value = "0"
|
||||
turnElementOff(distart)
|
||||
distart.value = "0"
|
||||
turnElementOff(disize)
|
||||
@@ -1768,6 +1777,7 @@ add_devices_script = """
|
||||
var devbaud = document.forms["uploadForm"]["dev_baud"].value;
|
||||
var devdata = document.forms["uploadForm"]["dev_data"].value;
|
||||
var devstop = document.forms["uploadForm"]["dev_stop"].value;
|
||||
var devpause = document.forms["uploadForm"]["dev_pause"].value;
|
||||
|
||||
var distart = document.forms["uploadForm"]["di_start"].value;
|
||||
var disize = document.forms["uploadForm"]["di_size"].value;
|
||||
@@ -1826,9 +1836,11 @@ edit_slave_devices_tail = """
|
||||
<input type='text' id='dev_data' name='device_data' placeholder='8'>
|
||||
<label for='dev_stop'><b>Stop Bits</b></label>
|
||||
<input type='text' id='dev_stop' name='device_stop' placeholder='1'>
|
||||
<label for='dev_pause'><b>Transmission Pause</b></label>
|
||||
<input type='text' id='dev_pause' name='device_pause' placeholder='0'>
|
||||
</div>
|
||||
</div>
|
||||
<div style="float:right; width:45%; height:730px">
|
||||
<div style="float:right; width:45%; height:780px">
|
||||
<p style='font-size:20px; margin-top:0px'><b>Discrete Inputs (%IX100.0)</b></p>
|
||||
<label for='di_start'><b>Start Address:</b></label>
|
||||
<input type='text' style='width: 20%' id='di_start' name='di_start' placeholder='0'>
|
||||
@@ -1898,6 +1910,7 @@ edit_devices_script = """
|
||||
var devparity = document.getElementById("dev_parity");
|
||||
var devdata = document.getElementById("dev_data");
|
||||
var devstop = document.getElementById("dev_stop");
|
||||
var devpause = document.getElementById("dev_pause");
|
||||
|
||||
var distart = document.getElementById("di_start");
|
||||
var disize = document.getElementById("di_size");
|
||||
@@ -2000,6 +2013,8 @@ edit_devices_script = """
|
||||
devparity.value = "None"
|
||||
turnElementOn(devdata)
|
||||
turnElementOn(devstop)
|
||||
turnElementOn(devpause)
|
||||
devpause.value = "0"
|
||||
turnElementOn(distart)
|
||||
turnElementOn(disize)
|
||||
turnElementOn(dostart)
|
||||
@@ -2026,6 +2041,8 @@ edit_devices_script = """
|
||||
devdata.value = "8"
|
||||
turnElementOff(devstop)
|
||||
devstop.value = "1"
|
||||
turnElementOff(devpause)
|
||||
devpause.value = "0"
|
||||
turnElementOff(distart)
|
||||
distart.value = "0"
|
||||
turnElementOff(disize)
|
||||
@@ -2062,6 +2079,8 @@ edit_devices_script = """
|
||||
devdata.value = "8"
|
||||
turnElementOff(devstop)
|
||||
devstop.value = "1"
|
||||
turnElementOff(devpause)
|
||||
devpause.value = "0"
|
||||
turnElementOff(distart)
|
||||
distart.value = "0"
|
||||
turnElementOff(disize)
|
||||
@@ -2102,6 +2121,7 @@ edit_devices_script = """
|
||||
var devbaud = document.forms["uploadForm"]["dev_baud"].value;
|
||||
var devdata = document.forms["uploadForm"]["dev_data"].value;
|
||||
var devstop = document.forms["uploadForm"]["dev_stop"].value;
|
||||
var devpause = document.forms["uploadForm"]["dev_pause"].value;
|
||||
|
||||
var distart = document.forms["uploadForm"]["di_start"].value;
|
||||
var disize = document.forms["uploadForm"]["di_size"].value;
|
||||
@@ -2153,6 +2173,7 @@ edit_devices_script = """
|
||||
var devparity = document.getElementById("dev_parity");
|
||||
var devdata = document.getElementById("dev_data");
|
||||
var devstop = document.getElementById("dev_stop");
|
||||
var devpause = document.getElementById("dev_pause");
|
||||
|
||||
var distart = document.getElementById("di_start");
|
||||
var disize = document.getElementById("di_size");
|
||||
|
||||
+15
-10
@@ -139,7 +139,8 @@ def generate_mbconfig():
|
||||
mbconfig += 'device' + str(device_counter) + '.RTU_Baud_Rate = "' + str(row[5]) + '"\n'
|
||||
mbconfig += 'device' + str(device_counter) + '.RTU_Parity = "' + str(row[6]) + '"\n'
|
||||
mbconfig += 'device' + str(device_counter) + '.RTU_Data_Bits = "' + str(row[7]) + '"\n'
|
||||
mbconfig += 'device' + str(device_counter) + '.RTU_Stop_Bits = "' + str(row[8]) + '"\n\n'
|
||||
mbconfig += 'device' + str(device_counter) + '.RTU_Stop_Bits = "' + str(row[8]) + '"\n'
|
||||
mbconfig += 'device' + str(device_counter) + '.RTU_TX_Pause = "' + str(row[21]) + '"\n\n'
|
||||
|
||||
mbconfig += 'device' + str(device_counter) + '.Discrete_Inputs_Start = "' + str(row[11]) + '"\n'
|
||||
mbconfig += 'device' + str(device_counter) + '.Discrete_Inputs_Size = "' + str(row[12]) + '"\n'
|
||||
@@ -1093,7 +1094,7 @@ def add_modbus_device():
|
||||
<br>
|
||||
<h2>Add new device</h2>
|
||||
<br>
|
||||
<div style="float:left; width:45%; height:730px">
|
||||
<div style="float:left; width:45%; height:780px">
|
||||
<form id = "uploadForm"
|
||||
enctype = "multipart/form-data"
|
||||
action = "add-modbus-device"
|
||||
@@ -1145,6 +1146,7 @@ def add_modbus_device():
|
||||
devparity = flask.request.form.get('device_parity')
|
||||
devdata = flask.request.form.get('device_data')
|
||||
devstop = flask.request.form.get('device_stop')
|
||||
devpause = flask.request.form.get('device_pause')
|
||||
|
||||
di_start = flask.request.form.get('di_start')
|
||||
di_size = flask.request.form.get('di_size')
|
||||
@@ -1157,15 +1159,15 @@ def add_modbus_device():
|
||||
aow_start = flask.request.form.get('aow_start')
|
||||
aow_size = flask.request.form.get('aow_size')
|
||||
|
||||
(devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size) \
|
||||
= sanitize_input(devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size)
|
||||
(devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devpause, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size) \
|
||||
= sanitize_input(devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devpause, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size)
|
||||
|
||||
database = "openplc.db"
|
||||
conn = create_connection(database)
|
||||
if (conn != None):
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
cur.execute("INSERT INTO Slave_dev (dev_name, dev_type, slave_id, com_port, baud_rate, parity, data_bits, stop_bits, ip_address, ip_port, di_start, di_size, coil_start, coil_size, ir_start, ir_size, hr_read_start, hr_read_size, hr_write_start, hr_write_size) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size))
|
||||
cur.execute("INSERT INTO Slave_dev (dev_name, dev_type, slave_id, com_port, baud_rate, parity, data_bits, stop_bits, ip_address, ip_port, di_start, di_size, coil_start, coil_size, ir_start, ir_size, hr_read_start, hr_read_size, hr_write_start, hr_write_size, pause) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size, devpause))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
conn.close()
|
||||
@@ -1212,7 +1214,7 @@ def modbus_edit_device():
|
||||
<br>
|
||||
<h2>Edit slave device</h2>
|
||||
<br>
|
||||
<div style="float:left; width:45%; height:730px">
|
||||
<div style="float:left; width:45%; height:780px">
|
||||
<form id = "uploadForm"
|
||||
enctype = "multipart/form-data"
|
||||
action = "modbus-edit-device"
|
||||
@@ -1296,7 +1298,8 @@ def modbus_edit_device():
|
||||
return_str += 'aorstart.value = "' + str(row[17]) + '";'
|
||||
return_str += 'aorsize.value = "' + str(row[18]) + '";'
|
||||
return_str += 'aowstart.value = "' + str(row[19]) + '";'
|
||||
return_str += 'aowsize.value = "' + str(row[20]) + '";}</script></html>'
|
||||
return_str += 'aowsize.value = "' + str(row[20]) + '";'
|
||||
return_str += 'devpause.value = "' + str(row[21]) + '";}</script></html>'
|
||||
|
||||
except Error as e:
|
||||
print("error connecting to the database" + str(e))
|
||||
@@ -1318,6 +1321,7 @@ def modbus_edit_device():
|
||||
devparity = flask.request.form.get('device_parity')
|
||||
devdata = flask.request.form.get('device_data')
|
||||
devstop = flask.request.form.get('device_stop')
|
||||
devpause = flask.request.form.get('device_pause')
|
||||
|
||||
di_start = flask.request.form.get('di_start')
|
||||
di_size = flask.request.form.get('di_size')
|
||||
@@ -1330,15 +1334,15 @@ def modbus_edit_device():
|
||||
aow_start = flask.request.form.get('aow_start')
|
||||
aow_size = flask.request.form.get('aow_size')
|
||||
|
||||
(devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size, devid_db) \
|
||||
= sanitize_input(devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size, devid_db)
|
||||
(devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devpause, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size, devid_db) \
|
||||
= sanitize_input(devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devpause, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size, devid_db)
|
||||
|
||||
database = "openplc.db"
|
||||
conn = create_connection(database)
|
||||
if (conn != None):
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
cur.execute("UPDATE Slave_dev SET dev_name = ?, dev_type = ?, slave_id = ?, com_port = ?, baud_rate = ?, parity = ?, data_bits = ?, stop_bits = ?, ip_address = ?, ip_port = ?, di_start = ?, di_size = ?, coil_start = ?, coil_size = ?, ir_start = ?, ir_size = ?, hr_read_start = ?, hr_read_size = ?, hr_write_start = ?, hr_write_size = ? WHERE dev_id = ?", (devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size, int(devid_db)))
|
||||
cur.execute("UPDATE Slave_dev SET dev_name = ?, dev_type = ?, slave_id = ?, com_port = ?, baud_rate = ?, parity = ?, data_bits = ?, stop_bits = ?, ip_address = ?, ip_port = ?, di_start = ?, di_size = ?, coil_start = ?, coil_size = ?, ir_start = ?, ir_size = ?, hr_read_start = ?, hr_read_size = ?, hr_write_start = ?, hr_write_size = ?, pause = ? WHERE dev_id = ?", (devname, devtype, devid, devcport, devbaud, devparity, devdata, devstop, devip, devport, di_start, di_size, do_start, do_size, ai_start, ai_size, aor_start, aor_size, aow_start, aow_size, devpause, int(devid_db)))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
conn.close()
|
||||
@@ -2397,6 +2401,7 @@ if __name__ == '__main__':
|
||||
openplc_runtime.start_runtime()
|
||||
time.sleep(1)
|
||||
configure_runtime()
|
||||
monitor.parse_st(openplc_runtime.project_file)
|
||||
|
||||
app.run(debug=False, host='0.0.0.0', threaded=True, port=8080)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user