西门子 博图 snap7

TIA_Portal_STEP7_Prof_Safety_WINCC_Adv(博途) 和 PLCSIM,前者用于开发程序,后者是仿真软件,可以直接在博途里打开,让程序在仿真软件里运行。如果第三方软件要访问仿真器,则使用 NetToPLCSim,第三方库是 snap7,C# 里就可以用,vs 里 nuget 搜 s7netplus。

博途
    如果安装出现错误之类的,可以再次安装,并选择 修改/更新。
    与安全有关的都不要,比如访问有完全访问的就选完全访问。
    右击 PLC_x[CPU xxx xxx],进 属性/常规/防护与安全/连接机制,勾选 允许来自远程对象的 PUT/GET 通信访问。
    右击 项目x,进 属性/保护,勾选 块编译时支持仿真。
    进 程序块,双击 添加新块,选择 数据块,右击该数据块,进 属性/常规/属性,取消勾选 优化的块访问,不然显示不了偏移量,然后点击 编译,就能看到偏移量了

NetToPLCSim
    使用管理员权限打开。
    在仿真软件打开之前要先打开,等待初始化操作完成,因为 NetToPLCSim 需要 102 端口,后打开就不行了。然后在博途里启动仿真并下载程序,让仿真运行起来。
    点击 NetToPLCSim 的 Add 进行添加。
    Network IP Address:运行 PLCSIM 的机器的 IP 地址,在虚拟机里就是虚拟机的 IP,点右边的 ... 就能选择,一般是第一个,什么 Intel的,第三方软件就连这个 IP。
    Plcsim IP Address:PLC 的 IP 地址,点右边的 ... 就能选择。
    Rack/Slot:PLC 所在的机架号和槽位号,根据给出的对应的 CPU 的机架号和槽位号的说明进行选择。
    添加完后,点 Start Server 启动服务。

PLCSIM
    仿真时修改变量:直接打开 PLCSIM 并运行,找到数据监控页,勾选数据块,添加 SIM 表,在表里输入变量名就可以添加了,然后勾选该变量,就可以修改了。
    软件安装完后要重启,不然没有 PLCSIM 模拟器网卡。
安装包:https://b23.tv/yi50eRv,B站关注这个up私信关键字就好,会自动回复,我也从这下的

安装
    1、进入 设置/应用/可选功能/更多 Windows 功能,点击 .NET Framework 3.5 (包括 .NET 2.0 和 3.0),选中框出现横杠就行,子选项不用选。出现新窗口,提示一个选项 让 Winodws 更新下载,点击。安装好进入下一步。
    2、安装 TIA_Portal_STEP7_Prof_Safety_WINCC_Adv_Unified_V18.iso。安装好后弹出镜像文件,清理注册表。
    3、安装 SIMATIC_S7-PLCSIM_V18.iso。安装好后弹出镜像文件,清理注册表。


破解
    1、用管理员权限打开 Sim_EKB_Install_2022_11_27.exe,选择 需要的密钥,选择框全选,点击 安装长密钥,可能会提示错误,不管,关掉,还会提示替换,选择 All。

提示
    不能开启 Windows 安全中心/应用和浏览器控制/智能应用控制,否则安装器会报“MSI file initialization failed”的错误。
    总的来说,安装和破解按照正常方法走,一般情况下不需要 破解(2) 步骤,但如果提示没有什么什么 许可/license,就需要了。
    如果安装出错,比如安装了一部分子软件,但是最后提示有错误,就重新打开这个安装器,到安装那一步选择 修改/更新,然后安装。
    每次安装或者 修改/更新 都需要删除一个叫 pending 的注册表项,或者用脚本删除,不然提示重启电脑,如果提示了就选择稍后重启、不重启这种的。

snap7

https://snap7.sourceforge.net/

api 在左边栏里的 Snap7 Library API

c/c++ 下载:https://sourceforge.net/projects/snap7/files,1.4.2 这样的目录里的
c# 的就用 vs 的 nuget 下载

使用方法

.net c#

snap7 C#
    读取函数
        直接读取

        命令读取
            读取命令
                命令和数据类型的长度有关,本质上就是解析命令换算成读取的地址和字节数,不同的类型对应读不同数量的字节,可以跳转函数查看。命令:DB 号 + 偏移量
                1 位  :bool。                    DB1.DBX0.0,读 DB1 的 0.0,并返回 bool 类型的数据。第一个数字是 DB 号,第二个是偏移量。
                1 字节:Byte。DB1.B22。
                2 字节:Int、Word。               DB1.DBW0.0。
                4 字节:DInt、DWord、Real(浮点)。DB1.DBD0.0。浮点数要先把数据转成浮点再转字符串。
                字符串:String、WString。         DB1:12,没有字符长度、DB1.STRING2.18,18是字符长度,对应 String[18]。
        
    西门子PLC有两种字符串,一种是 String,另一种是 WString,前者是每一个字符由两个字节构成,大小为 256 个字节;后者是每一个字符由四个字节构成,大小为 512 个字节。所以英文字符采用 String,中文字符采用 WString,虽然 WString 在博图中无法查看具体字符串,只能看到编码,但是不影响正常的写入和读取。

    var db1Bool1 = plc.Read("DB1.DBX0.0");
    Console.WriteLine("DB1.DBX0.0:" + db1Bool1);

    bool db1Bool2 = (bool)plc.Read("DB1.DBX0.1");
    Console.WriteLine("DB1.DBX0.1:" + db1Bool2);

    int IntVariable = (ushort)plc.Read("DB1.DBW2.0");
    Console.WriteLine("DB1.DBW2.0:" + IntVariable);

    float RealVariable = ((uint)plc.Read("DB1.DBD4.0")).ConvertToFloat();
    Console.WriteLine("DB1.DBD4.0:" + RealVariable);

    var dIntVariable = (uint)plc.Read("DB1.DBD8.0");
    Console.WriteLine("DB1.DBD8.0: " + dIntVariable);

    var dWordVariable = (uint)plc.Read("DB1.DBD12.0");
    Console.WriteLine("DB1.DBD12.0: " + Convert.ToString(dWordVariable, 16));

    var wordVariable = (ushort)plc.Read("DB1.DBW16.0");
    Console.WriteLine("DB1.DBW16.0: " + Convert.ToString(wordVariable,16));

    float f = (float)plc.Read(DataType.DataBlock, 4, 78, VarType.Real, 1);
    float[] f = (float[])plc.Read(DataType.DataBlock, 4, 0, VarType.Real, 14);
    
    (bool)plc.Read("M11.6");
    (bool)plc.Read("Q1.0");
    plc.Write("M11.1", true);

qt c/c++

文件需要 snap7.cpp、snap7.h、snap7.dll

DBRead 读取 DB
MBRead 读取 M
EBRead 读取 I
ABRead 读取 Q

plc.hpp:
#include "snap7.h"

float byte_reverse(float data_p)
{
    quint8 buffer[4];
    for (int i = 0; i < 4; i++)
    {
        buffer[i] = *((quint8 *)(&data_p) + (3 - i));
    }

    return *((float *)buffer);
}
TS7Client s7_client;
float buffer_real[100];
quint8 buffer_M[100];
quint8 buffer_I[100];
quint8 buffer_Q[3];
bool buttom[100];

// 返回 0 是无错误
s7_client.ConnectTo(ip.toLatin1().data(), 0, 1);
s7_client.DBRead(4 /*DB4*/, 0 /*起始地址*/, 14 * 4, &buffer_real[0]); // plc 的 real 就是 float,4 字节大小,从 0 开始读 14 个 real。并且需要字节倒叙处理才能正常用
buffer_real[0] = byte_reverse(buffer_real[0]);

// 读 M,11.2
s7_client.MBRead(11, 1, &buffer_M[0]); // 读出来一个字节,也就是 11.1-11.8
buttom[0] = (bool)(buffer_M[0] & (0x01 << 2); // 通过位移 2 获取 11.2

s7_client.EBRead(0, 1, &buffer_I[0]);
s7_client.EBRead(1, 1, &buffer_I[1]);
s7_client.ABRead(0, 1, &buffer_Q[0]);

s7_client.Disconnect();
CMakeLists.txt

将下载的包解压后放到项目里,配置 CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

project(plc_monitor VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 6.2 COMPONENTS Quick REQUIRED)

set(back_path my/back)
set(component_path my/component)
set(front_path my/front)

include_directories(
    ${back_path}
    ${component_path}/log/c_cpp
    ${component_path}/plc
)

aux_source_directory(${back_path} source_file)
aux_source_directory(${component_path}/plc source_file)

link_directories(${component_path}/plc)

qt_add_executable(appplc_monitor
    main.cpp
    ${source_file}
)

qt_add_qml_module(appplc_monitor
    URI plc_monitor
    VERSION 1.0
    QML_FILES main.qml 
        ${front_path}/Top_t.qml
        ${front_path}/Buttom_t.qml
        ${front_path}/Buttom_page_1_t.qml
        ${front_path}/Buttom_page_2_t.qml
        ${component_path}/log/js/log.js
)

set_target_properties(appplc_monitor PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

target_link_libraries(appplc_monitor
    PRIVATE Qt6::Quick
        snap7
)

install(TARGETS appplc_monitor
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

你可能感兴趣的:(plc,单片机,嵌入式硬件,plc)