OpenPLC
2024-02-02 19:03:35 0 举报
AI智能生成
为你推荐
查看更多
抱歉,暂无相关内容
OpenPLC项目解析
作者其他创作
大纲/内容
OpenPLC
install.sh
linux_install_deps
install_py_deps
把编译后的iec2c拷贝到webserver文件夹
使用make编译开源编译器matiec生成iec2c
把编译后的st_optimizer拷贝到webserver文件夹
编译utils/st_optimizer_src
把编译后的glue_generator拷贝到webserver文件夹
编译utils/glue_generator_src
使用make编译dnp3源码
使用make编译libmodbus源码
创建openplc.service,把项目设置为开机自启动服务
install_all_libs
change_hardware_layer.sh
使用st_optimizer优化st文件
使用iec2c把st文件编译成c文件并移动到core文件夹
链接生成可执行文件openplc
glue_generator
编译st生产的c文件和其它core文件生产object文件
compile_program.sh
background_installer.sh
start_openplc.sh
socket_fd = createSocket_interactive(port)
client_fd = waitForClient_interactive(socket_fd)
run_modbus = 0
run_dnp3 = 0
run_openplc = 0
quit
argument = (char)readCommandArgumentStr(buffer)
log(log_msg)
ethercat_configured = configureEthercat()
start_ethercat
modbus_port = readCommandArgument(buffer);
已开启则重启modbus服务
run_modbus = 1;
socket_fd = createSocket(port);
bufferSize < 8
buffer[7] == MB_FC_READ_COILS
buffer[7] == MB_FC_READ_INPUTS
buffer[7] == MB_FC_READ_HOLDING_REGISTERS
buffer[7] == MB_FC_READ_INPUT_REGISTERS
buffer[7] == MB_FC_WRITE_COIL
buffer[7] == MB_FC_WRITE_REGISTER
buffer[7] == MB_FC_WRITE_MULTIPLE_COILS
buffer[7] == MB_FC_WRITE_MULTIPLE_REGISTERS
其他
protocol_type == MODBUS_PROTOCOL
start_modbus
run_modbus=0
stop_modbus
dnp3_port = readCommandArgument(buffer);
run_dnp3 = 1
auto channel = manager.AddTCPServer(\"DNP3_Server\
dnp3StartServer(dnp3_port)
start_dnp3
stop_dnp3
enip_port = readCommandArgument(buffer)
run_enip = 0
run_enip = 1
已开启则重启enip服务
protocol_type == ENIP_PROTOCOL
start_enip
stop_enip
pstorage_polling = readCommandArgument(buffer)
run_pstorage = 1
persistentBuffer[i] = *int_memory[i]
FILE *ps = fopen(\"persistent.file\
把int_memory数组中的数据保存到persistent.file文件中
if (persistentBuffer[i] != *int_memory[i]){ persistentBuffer[i] = *int_memory[i];}
FILE *fd = fopen(\"persistent.file\
int_memory中数据变化时重新持久化
startPstorage()
start_pstorage
run_pstorage = 0
stop_pstorage
runtime_logs
exec_time
未知指令直接报错
startInteractiveServer(43628)
config_init__
void glueVars(){}
glueVars
初始化PLC
MUTEX INITIALIZATION
ethercat_configure(\"../utils/ethercat_src/build/ethercat.cfg\
#ifdef _ethercat_src
initializeHardware
parseConfig
modbus_new_tcp
modbus_set_slave
modbus_set_response_timeout
initializeMB
initCustomLayer
updateBuffersIn
updateCustomIn
updateBuffersOut
updateCustomOut
初始化HARDWARE
glueVars()
mapUnusedIO()
FILE *fd = fopen(\"persistent.file\
*int_memory[i] = persistentBuffer[i]
pstorage_read = true;
readPersistentStorage()
初始化持久化存储
struct sched_param sp
mlockall(MCL_FUTURE|MCL_CURRENT)
设置线程优先级
MAIN LOOP
main.cpp
在去Programs表中查询其project_name,project_description,project_file并绑定到runtime实例上
读取active_program中保存的当前runtime所对应的st_file文件名
self.theprocess = subprocess.Popen(['./core/openplc'])
openplc_runtime.start_runtime()
self._rpc('start_modbus(502)')
openplc_runtime.start_modbus(502)
502
self._rpc('stop_modbus()')
openplc_runtime.stop_modbus()
disabled
查询settings表中的Modbus_port字段值
self._rpc('start_dnp3(20000)')
openplc_runtime.start_dnp3(20000)
20000
self._rpc('stop_dnp3()')
openplc_runtime.stop_dnp3()
查询settings表中的Dnp3_port字段值
self._rpc('start_enip(44818)')
openplc_runtime.start_enip(44818)
44818
self._rpc('stop_enip()')
openplc_runtime.stop_enip()
查询settings表中的Enip_port字段值
self._rpc(f'start_pstorage({poll_rate})')
openplc_runtime.start_pstorage(poll_rate)
poll_rate
self._rpc('stop_pstorage()')
openplc_runtime.stop_pstorage()
查询settings表中的Pstorage_polling字段值
configure_runtime()
monitor.parse_st(openplc_runtime.project_file)
默认为False,为True时
查询settings表,根据表中Start_run_mode字段值决定是否启动core代码编译出的plc软件
启动python的web服务
main
get请求返回登录页面
成功则跳转到Dashboard页面
失败则跳转回到登录页面
post请求校验用户名和密码
login界面
monitor_active = False;mb_client.close();
monitor.stop_monitor()
del debug_vars[:]
monitor.cleanup()
点击首页左侧导航栏的start_plc按钮
self._rpc('quit()')
openplc_runtime.stop_runtime()
点击首页左侧导航栏的stop_plc按钮
openplc_runtime.status()
openplc_runtime.project_name
openplc_runtime.project_description
openplc_runtime.project_file
openplc_runtime.exec_time()
从runtime实例属性上获取Status,Program,Description,File值绘制网页
openplc_runtime.logs()
使用ajax请求/runtime_logs接口获取runtime运行日志绘制在网页上
绘制dashboard网页
Dashboard界面
在网页表单中展示当前program的详细信息
在数据库中查询点击的program信息
查询数据库获取当前program信息保存到runtime实例属性上,用于绘制网页
os.remove(\"persistent.file\")
delete_persistent_file()
compilation_object = NonBlockingStreamReader(a.stdout)
openplc_runtime.compile_program(st_file)
compile_program
点击Launch program按钮访问/compile-program页面
line = compilation_object.readline()
openplc_runtime.compilation_status()
使用ajax请求/compilation-logs接口获取编译日志
draw_compiling_page()
重定向到/compile-program页面编译st文件
访问/update_program_action接口
在/Update-program网页中选择新的st文件,点击Upload Program按钮
点击Update_program按钮访问/Update-program网页
从数据库中删除当前program
点击Remove_program按钮访问/remove-program接口
点击表格中的program会访问/reload-program页面
查询数据库中存储的所有/部分program展示在网页的表格中
访问/upload-program-action接口
填写完页面中的表单,点击Upload program按钮
返回/upload-program页面
在Upload Program部分,选择完st文件点击Upload Program按钮会访问/upload-program页面
Programs界面
从Slave_dev表中查出slave设备信息以表格的形式显示在网页上
填写完slave设备信息后点击Save Device按钮后向当前页面以POST方式提交表单
返回添加slave信息的表单页面
GET请求
把slave设备信息保存到数据库
根据数据库中保存的设备信息生成mbconfig.cfg文件
generate_mbconfig()
重定向回Slave Device界面,即/modbus页面
POST请求
点击Add New Device按钮会跳转到/add-modbus-device页面
从数据库中删除当前设备信息
根据数据库中保存的设备信息重新生成mbconfig.cfg文件
点击Delete device按钮访问/delete-device接口
返回修改slave信息的表单页面
更新数据库中的slave设备信息
点击表格中的slave信息会跳转到/modbus-edit-device页面
Slave Devices界面
modbus_monitor()
monitor.start_monitor(modbus_port_cfg)
从Settings表中查询modbus_port_cfg
根据表单中table_id去debug_var查询数据生成html
point_info
point_update
从表单中获取modbus_port_cfg
根据debug_vars生成html
monitor_update
把debug_vars中数据渲染到html
monitoring界面
GET:读取./core/psm/main.py文件内容生成html
把从表单中读取的custom_layer_code保存到main文件中
把从表单中读取的hardware_layer作为change_hardware_layer.sh脚本的参数执行
POST:
用main.original文件内容覆盖到mian
restore_custom_hardware
hardware界面
查询settings表显示到网页上
修改设置后点击Save Changes按钮后把表单中配置项写入到settings表
settings界面
add_user
edit_user
delete_user
logout
user CRUD
users界面
webserver.py
0 条评论
回复 删除
下一页