抛开梯形图,写程序用命令行控制PLC

本文演示了如何绕过PLC自带的编程软件,使用文本编辑器直接编写控制程序,实现PLC输出的精确控制,如调整LED闪烁间隔。
 一般PLC的控制都是使用PLC自带的编程软件进行编程,而编程的内容一般都是使用梯形图或者功能图块。现在我们演示一下抛开PLC自带的编程软件(IDE),直接使用文本编辑器编辑程序来控制PLC执行相关的输出。

    下面的演示中我们首先连接PLC并清空了PLC中的梯形图,然后通过文本编辑器编写了一个让PLC每秒闪烁一次的程序并进行了执行。为了证明是文本程序起的作用,我们再度将闪烁间隔改为2秒……

视频地址
愚公电气科技有限公司

好的,既然你希望**先抛开绘图接口**,我们专注于构建整个架构的**核心基础部分**。我们将从底层资源管理、设备创建、SwapChain和DirectComposition支持开始,逐步搭建一个稳定、兼容性强、可扩展的DC渲染后端。 --- ### **1. 整体架构目标(当前阶段)** - 创建统一的D3D/D2D共享设备。 - 根据Windows版本动态决定是否使用SwapChain或DirectComposition。 - 实现窗口与渲染表面的绑定。 - 管理每个窗口独立的D2D绘制上下文和纹理资源。 - 提供系统检测功能以适配不同平台特性。 --- ### **2. 架构模块划分(当前阶段)** | 模块 | 功能 | 说明 | |------|------|------| | **SystemDetector** | 系统版本检测 | 判断当前系统是否为Win7/Win8/Win8.1/Win10,并判断是否支持DirectComposition。 | | **RenderingContextManager** | 渲染设备管理 | 负责创建并维护D3D11设备和D2D工厂对象,这些是全局共享的。 | | **SurfaceManager** | 表面管理 | 为每个窗口创建对应的SwapChain和D2DRenderTarget,管理其生命周期。 | | **CompositionManager** | 合成管理(仅Win8+/Win10) | 使用DirectComposition将多个视觉元素合成输出到屏幕。 | --- ### **3. 详细组件设计** #### **3.1 SystemDetector(系统检测模块)** ```cpp class SystemDetector { public: static bool IsWindows7(); static bool IsWindows8OrHigher(); static bool IsWindows10OrHigher(); static bool HasDirectCompositionSupport(); // Windows 8 及以上支持 }; ``` - `IsWindows7()`:通过检查操作系统版本号判断是否为Win7。 - `HasDirectCompositionSupport()`:检查是否可用`IDCompositionDevice`接口。 #### **3.2 RenderingContextManager(渲染设备管理器)** ```cpp class RenderingContextManager { public: void Initialize(); void Shutdown(); ID3D11Device* GetD3DDevice(); ID2D1Factory* GetD2DFactory(); ID2D1Device* GetD2DDevice(); ID2D1DeviceContext* GetSharedD2DContext(); private: ID3D11Device* d3dDevice = nullptr; ID2D1Factory* d2dFactory = nullptr; ID2D1Device* d2dDevice = nullptr; ID2D1DeviceContext* sharedD2DContext = nullptr; }; ``` - 所有设备在初始化时创建一次,确保跨窗口/线程共享。 - D2D设备上下文可以是共享的(用于某些场景),也可以为每个窗口独立创建。 #### **3.3 SurfaceManager(表面管理器)** ```cpp struct SwapChainInfo { IDXGISwapChain* swapChain = nullptr; ID2D1HwndRenderTarget* renderTarget = nullptr; ID3D11Texture2D* backBuffer = nullptr; }; class SurfaceManager { public: void Create(HWND hWnd); void Release(HWND hWnd); SwapChainInfo* GetSwapChainInfo(HWND hWnd); private: std::map<HWND, SwapChainInfo> swapChains; }; ``` - 每个窗口对应一个SwapChain和D2DRenderTarget。 - 如果使用SwapChain,则由`RenderingContextManager`提供的D3D/D2D设备创建。 - 若不使用SwapChain(如Win10中用DirectComposition),则可能不需要该结构。 #### **3.4 CompositionManager(合成管理器)** ```cpp class CompositionManager { public: void Initialize(HWND hWnd); void AddVisual(ID2D1Bitmap* bitmap); void Update(); void Present(); private: IDCompositionDevice* compositionDevice = nullptr; IDCompositionTarget* compositionTarget = nullptr; IDCompositionVisual* visual = nullptr; }; ``` - 仅在Windows 8及以上版本启用。 - 将D2D绘制结果作为纹理附加到Visual上,最终由DirectComposition进行合成输出。 --- ### **4. 初始化流程(伪代码)** ```cpp // 全局入口点 void InitRenderBackend(HWND hWnd) { SystemDetector sysDet; if (sysDet.IsWindows10OrHigher()) { // Win10: 使用 DirectComposition + D2D RenderingContextManager contextManager; contextManager.Initialize(); CompositionManager compManager; compManager.Initialize(hWnd); } else if (sysDet.IsWindows8OrHigher() && sysDet.HasDirectCompositionSupport()) { // Win8/8.1: 使用 SwapChain + D2D + DirectComposition RenderingContextManager contextManager; contextManager.Initialize(); SurfaceManager surfaceManager; surfaceManager.Create(hWnd); CompositionManager compManager; compManager.Initialize(hWnd); } else { // Win7: 使用 SwapChain + D2D RenderingContextManager contextManager; contextManager.Initialize(); SurfaceManager surfaceManager; surfaceManager.Create(hWnd); } } ``` --- ### **5. 架构总结(当前阶段)** - **系统检测模块**决定了渲染路径选择。 - **渲染设备管理器**提供了共享的D3D和D2D资源。 - **表面管理器**负责每个窗口的SwapChain和D2D上下文。 - **合成管理器**仅在Win8+中启用,实现高级合成效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值