.net任务调度平台 Dyd.BaseService.TaskManager

国外网速慢,最新版本迁移至http://git.oschina.net/chejiangyi/Dyd.BaseService.TaskManager

.net 简单任务调度平台

用于.net dll,exe的任务的挂载,任务的隔离,调度执行,访问权限控制,监控,管理,日志,错误预警,性能分析等。

  1. 平台基于quartz.net进行任务调度功能开发,采用C#代码编写, 支持corn表达式和第三方自定义的corn表达式扩展。

  2. 架构以插件形式开发,具有良好的功能扩展性,稳定性,简单性,便于第三方开发人员进一步进行功能扩展。

  3. 支持多节点集群,便于集群服务器的资源有效分配,任务的相互隔离。

  4. 支持邮件形式的错误预警,便于运维及时处理任务异常等。

-- 车江毅 2015-06-17

Dyd.BaseService.TaskManager源码部署须知:

  • 1、删除各个项目中Newtonsoft.Json.dll的引用
  • 2、检查各项目中XXF.dll的引用,确保引用了“引用”文件夹中的XXF.dll
  • 3、执行,建模脚本.txt中的sql server脚本语句
  • 4、【Dyd.BaseService.TaskManager.Web】 任务管理后台,部署此站点,修改web.config数据库的字符串连接
  • 5、修改登录代码和用户权限(看源码),不用源码内部通过crm登录
  • 6、【Dyd.BaseService.TaskManager.MonitorTasks】 监控任务,此任务需要重新生成,打包此此文件(原有的打包文件可以直接删除)
  • 7、【Dyd.BaseService.TaskManager.WinService】 进行服务安装,修改安装包的实际路径
  • 8、管理后台,可以正常访问后,请参照 “任务调度平台安装->任务调度平台部署流程(示例).xls”,来新建任务,调通任务可以正常进行,则为成功
*(感谢俞忠亮同学整理)*
## 开源相关群: .net 开源基础服务 238543768 ## (大家都有本职工作,也许不能及时响应和跟踪解决问题,请谅解。)

任务demo示例

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Dyd.BaseService.TaskManager.Demo
{
    /// <summary>
    /// 任务调度平台 任务插件的写法demo及说明
    /// </summary>
    public class DemoTask : XXF.BaseService.TaskManager.BaseDllTask
    {
        /// <summary>
        /// 任务调度平台根据发布的任务时间配置,定时回调运行方法
        /// 开发人员的任务插件必须要重载并该方法
        /// </summary>
        public override void Run()
        {
            /* 
             * this.OpenOperator 用于任务调度平台提供给第三方使用的所有api接口封装
             */
 
            /*获取当前任务dll安装目录*/
            this.OpenOperator.GetTaskInstallDirectory();
 
            /*打印一条日志到任务调度平台,因为日志会存到平台数据库,所以日志要精简,对任务出错时有分析价值【注意:不要频繁打印无用的,非必要的,对分析无价值的日志信息】*/
            this.OpenOperator.Log("这里打印一条日志到任务调度平台");
 
            /*打印一条错误到任务调度平台,因为日志会存到平台数据库,所以日志要精简,对任务出错时有分析价值【注意:不要频繁打印无用的,非必要的,对分析无价值的日志信息】
             *后续任务会有增加优先级区分,根据任务的优先级,错误的出现频率等,错误日志会定期推送到开发者邮箱和短信*/
            this.OpenOperator.Error("这里打印一条错误日志到任务调度平台", new Exception("错误msg信息"));
 
            /*从数据库获取任务的临时数据,临时数据以jason的形式保存在数据库里面,便于任务上下文的恢复和信息传递【注意:不应用于"频繁的"存储"大量的"临时数据,会操作网络耗时和数据库性能差】*/
            var databasetempinfo = this.OpenOperator.GetDataBaseTempData<DemoTaskDatabaseTempInfo>();
            if (databasetempinfo == null)//若任务第一次运行,可能没有临时数据。当然也可以在发布任务的时候配置临时数据也可。
            {
                databasetempinfo = new DemoTaskDatabaseTempInfo();
                databasetempinfo.LastLogID = 0;
            }
 
            /*将任务的临时数据持久化到数据库中,临时数据以json的形式保存在数据库里面,便于任务上下文的恢复和信息传递【注意:不应用于"频繁的"存储"大量的"临时数据,会操作网络耗时和数据库性能差】
              若临时数据用于下一次使用,必须要执行此方法,否则下次无法获取【注意:执行此方法,当前临时数据有可能被重置为null,便于内存资源释放】*/
            this.OpenOperator.SaveDataBaseTempData(databasetempinfo);
 
            /*从本地安装目录中获取任务的临时数据,临时数据以jason的形式保存在本地,便于任务上下文的恢复和信息传递【注意:本地临时数据一般用于保存"大量的"临时数据】*/
            var localtempinfo = this.OpenOperator.GetLocalTempData<DemoTaskLocalTempInfo>();
            if (localtempinfo == null)//若任务第一次运行,可能没有临时数据。当然也可以在发布任务的时候上传临时数据json至安装压缩包中也可。
            {
                localtempinfo = new DemoTaskLocalTempInfo();
                localtempinfo.file = new byte[0];
            }
 
            /*将任务的临时数据持久化到本地安装目录中,临时数据以json的形式保存在本地安装目录里面,便于任务上下文的恢复和信息传递【注意:本地临时数据一般用于保存"大量的"临时数据】
              若临时数据用于下一次使用,必须要执行此方法,否则下次可能无法获取【注意:执行此方法,当前临时数据有可能被重置为null,便于内存资源释放】*/
            this.OpenOperator.SaveLocalTempData(localtempinfo);
 
            {
                string msg = "执行业务中...."+ this.AppConfig["sendmailhost"];
                Debug.WriteLine(msg);
                System.IO.File.AppendAllText(this.OpenOperator.GetTaskInstallDirectory()+"业务.txt", msg);
            }
        }
        /// <summary>
        /// 开发人员自测运行入口
        /// 需要将项目配置为->控制台应用程序,写好Program类和Main入口函数
        /// </summary>
        public override void TestRun()
        {
            /*测试环境下任务的配置信息需要手工填写,正式环境下需要配置在任务配置中心里面*/
            this.AppConfig = new XXF.BaseService.TaskManager.SystemRuntime.TaskAppConfigInfo();
            this.AppConfig.Add("sendmailhost", "smtp.163.com");
            this.AppConfig.Add("sendmailname", "fengyeguigui@163.com");
            this.AppConfig.Add("password", "******");
 
            base.TestRun();
        }
    }
 
    /// <summary>
    /// 任务调度平台之临时数据信息,用于任务上下文的信息传递。
    /// 将会以json形式保存在任务调度平台数据库中,便于下一次回调运行时恢复并使用。【注意:不应用于"频繁的"存储"大量的"临时数据,会操作网络耗时和数据库性能差】
    /// </summary>
    public class DemoTaskDatabaseTempInfo
    {
        public int LastLogID { get; set; }
    }
 
    /// <summary>
    /// 任务调度平台之临时数据信息,用于任务上下文的信息传递。
    /// 将会以json形式保存在任务调度平台本地安装文件夹中,便于下一次回调运行时恢复并使用。【注意:本地临时数据一般用于保存"大量的"临时数据】
    /// </summary>
    public class DemoTaskLocalTempInfo
    {
        public byte[] file { get; set; }
    }
}

web后端部分截图及安装

未来构想:

    1. 任务故障转移: 检测到任务持续故障n次或者故障频率,判定进行异地节点/节点集群内的任务启动,可支持n次故障恢复。
  • 2)任务负载均衡: 多个任务并行执行,用于高资源负载任务的多节点运行。
  • 3)任务拆分: 一个父级任务可以创建多个子任务,并对任务进行管理,调度,故障恢复,预警等。

转载于:https://www.cnblogs.com/Jeely/p/11358861.html

这段代码实现了一个基于 PID 控制器和前馈补偿的控制系统。具体来说,它包括以下几个部分: 1. 系统建模:首先定义一个连续系统模型 sys,其中传递函数为 133/(s^2 + 25s),然后使用 c2d 函数将其离散化得到离散系统模型 dsys。 ``` sys=tf(133,[1,25,0]); dsys=c2d(sys,ts,'z'); [num,den]=tfdata(dsys,'v'); ``` 2. 反馈控制器:利用 PID 控制器实现反馈控制。在每个时刻 k,通过测量系统输出 y(k) 与期望输出 yd(k) 之间的误差,计算出控制器输出 u(k)。 ``` error(k)=yd(k)-y(k); ei=ei+error(k)*ts; up(k)=80*error(k)+20*ei+2.0*(error(k)-error_1)/ts; ``` 其中,ei 表示误差的积分项,error_1 表示上一个时刻的误差。这里的 PID 控制器系数是手动调整得到的,可以根据实际应用需要进行调整。 3. 前馈补偿:为了进一步提高系统的跟踪性能,引入了前馈补偿。在每个时刻 k,通过测量期望输出 yd(k) 的变化率 dyd(k) 和加速度 ddyd(k),计算出前馈控制器输出 uf(k)。 ``` uf(k)=25/133*dyd(k)+1/133*ddyd(k); ``` 其中,系数 25/133 和 1/133 是根据系统模型得到的,可以根据实际应用需要进行调整。 4. 控制器输出求和:最终的控制器输出 u(k) 是反馈控制器输出 up(k) 和前馈控制器输出 uf(k) 的加权和,即 ``` u(k)=up(k)+uf(k); ``` 可以通过设置变量 M 来选择是否使用前馈补偿。当 M=1 时,只使用 PID 控制器;当 M=2 时,使用 PID 控制器和前馈补偿。 5. 限幅:为了保证控制信号 u(k) 的安全性,引入了限幅,将 u(k) 限制在 [-10, 10] 的范围内。 ``` if u(k)>=10 u(k)=10; end if u(k)<=-10 u(k)=-10; end ``` 6. 数据保存和显示:最后,将仿真结果保存并绘制图像,包括期望输出 yd(k)、实际输出 y(k)、误差 error(k)、控制器输出 up(k)、前馈控制器输出 uf(k) 和总输出信号 u(k)。 ``` time(k)=k*ts; A=0.5;F=3.0; yd(k)=A*sin(F*2*pi*k*ts); dyd(k)=A*F*2*pi*cos(F*2*pi*k*ts); ddyd(k)=-A*F*2*pi*F*2*pi*sin(F*2*pi*k*ts); y(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; figure(1); subplot(211); plot(time,yd,'r',time,y,'k:','linewidth',2); xlabel('time(s)');ylabel('yd,y'); legend('Ideal position signal','Position tracking'); subplot(212); plot(time,error,'r','linewidth',2); xlabel('time(s)');ylabel('error'); figure(2); plot(time,up,'k',time,uf,'b',time,u,'r','linewidth',2); xlabel('time(s)');ylabel('up,uf,u'); ``` 这里使用了 sin 函数生成了一个正弦波作为期望输出信号 yd(k),然后通过离散系统模型计算出实际输出 y(k)。最后,使用 subplot 和 plot 函数绘制了两幅图,分别显示了期望输出 yd(k)、实际输出 y(k)、误差 error(k) 和控制器输出 up(k)、前馈控制器输出 uf(k) 和总输出信号 u(k)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值