为了便于在OpenModelica进行仿真,形成一个完整的仿真模型,没有使用第三方的库,参照了DrModelica的例程,按照Modelica库的开源模型定义了所用的基本元件模型。

首先给出一些基本类型的定义:

type ElectricPotential     = Real;
type ElectricCurrent = Real(quantity = "ElectricCurrent", unit = "A");
type Resistance = Real(quantity = "Resistance", unit = "Ohm", min = 0);
type Inductance = Real(quantity = "Inductance", unit = "H", min = 0);
type Voltage = ElectricPotential;
type Current = ElectricCurrent; type Force = Real(quantity = "Force", unit = "N");
type Angle = Real(quantity = "Angle", unit = "rad", displayUnit = "deg");
type Torque = Real(quantity = "Torque", unit = "N.m");
type AngularVelocity = Real(quantity = "AngularVelocity", unit = "rad/s", displayUnit = "rev/min");
type AngularAcceleration = Real(quantity = "AngularAcceleration", unit = "rad/s2");
type MomentOfInertia = Real(quantity = "MomentOfInertia", unit = "kg.m2"); type Time = Real (final quantity="Time", final unit="s"); connector RotFlange_a "1D rotational flange (filled square)"
Angle phi "Absolute rotational angle of flange";
flow Torque tau "Torque in the flange";
end RotFlange_a; //From Modelica.Mechanical.Rotational.Interfaces connector RotFlange_b "1D rotational flange (filled square)"
Angle phi "Absolute rotational angle of flange";
flow Torque tau "Torque in the flange";
end RotFlange_b; //From Modelica.Mechanical.Rotational.Interfaces connector Pin "Pin of an electrical component"
Voltage v "Potential at the pin";
flow Current i "Current flowing into the pin";
end Pin; //From Modelica.Electrical.Analog.Interfaces connector PositivePin "Positive pin of an electrical component"
Voltage v "Potential at the pin";
flow Current i "Current flowing into the pin";
end PositivePin; //From Modelica.Electrical.Analog.Interfaces connector NegativePin "Negative pin of an electrical component"
Voltage v "Potential at the pin";
flow Current i "Current flowing into the pin";
end NegativePin; //From Modelica.Electrical.Analog.Interfaces connector InPort "Connector with input signals of type Real"
parameter Integer n = 1 "Dimension of signal vector";
input Real signal[n] "Real input signals";
end InPort; // From Modelica.Blocks.Interfaces connector OutPort "Connector with output signals of type Real"
parameter Integer n = 1 "Dimension of signal vector";
output Real signal[n] "Real output signals";
end OutPort; // From Modelica.Blocks.Interfaces

基于上述自定义类型,定义一些基本元件的模型:

partial model Rigid           // Rotational class Rigid
"Base class for the rigid connection of two rotational 1D flanges"
Angle phi "Absolute rotation angle of component";
RotFlange_a rotFlange_a "(left) driving flange (axis directed into plane)";
RotFlange_b rotFlange_b "(right) driven flange (axis directed out of plane)";
equation
rotFlange_a.phi = phi;
rotFlange_b.phi = phi;
end Rigid; // From Modelica.Mechanics.Rotational.Interfaces model Inertia "1D rotational component with inertia"
extends Rigid;
parameter MomentOfInertia J = 1 "Moment of inertia";
AngularVelocity w "Absolute angular velocity of component";
AngularAcceleration a "Absolute angular acceleration of component";
equation
w = der(phi);
a = der(w);
J*a = rotFlange_a.tau + rotFlange_b.tau;
end Inertia; //From Modelica.Mechanics.Rotational partial model TwoPin // Same as OnePort in Modelica.Electrical.Analog.Interfaces
"Component with two electrical pins p and n and current i from p to n"
Voltage v "Voltage drop between the two pins (= p.v - n.v)";
Current i "Current flowing from pin p to pin n";
PositivePin p;
NegativePin n;
equation
v = p.v - n.v;
0 = p.i + n.i;
i = p.i;
end TwoPin; model DCMotor "DC Motor"
extends TwoPin;
extends Rigid;
OutPort SensorVelocity(n=1);
OutPort SensorCurrent(n=1);
parameter MomentOfInertia J"Total Inertia";
parameter Resistance R"Armature Resistance";
parameter Inductance L"Armature Inductance"; parameter Real Kt"Torque Constant";
parameter Real Ke"EMF Constant"; AngularVelocity w "Angular velocity of motor";
AngularAcceleration a "Absolute angular acceleration of motor";
Torque tau_motor;
RotFlange_b rotFlange_b; // Rotational Flange_b equation w = der(rotFlange_b.phi);
a = der(w);
v = R*i+Ke*w+L*der(i);
tau_motor = Kt*i;
J*a = tau_motor + rotFlange_b.tau;
SensorVelocity.signal[1] = w;
SensorCurrent.signal[1] = i;
end DCMotor; class Resistor "Ideal linear electrical Resistor"
extends TwoPin; // Same as OnePort
parameter Real R(unit = "Ohm") "Resistance";
equation
R*i = v;
end Resistor; // From Modelica.Electrical.Analog.Basic class Inductor "Ideal linear electrical Inductor"
extends TwoPin; // Same as OnePort
parameter Real L(unit = "H") "Inductance";
equation
v = L*der(i);
end Inductor; // From Modelica.Electrical.Analog.Basic class Ground "Ground node"
Pin p;
equation
p.v = 0;
end Ground; // From Modelica.Electrical.Analog.Basic model PWMVoltageSource
extends TwoPin;
InPort Command(n=1); parameter Time T = 0.003;
parameter Voltage Vin = 200; equation T*der(v)+ v = Vin*Command.signal[1]/10; end PWMVoltageSource; block Controller InPort command(n=1);
InPort feedback(n=1);
OutPort outPort(n=1); Real error;
Real pout;
parameter Real Kp=10;
parameter Real Max_Output_Pos = 10;
parameter Real Max_Output_Neg = -10; // parameter Real Ki=1; algorithm error := command.signal[1] - feedback.signal[1];
pout := Kp * error; if pout > Max_Output_Pos then
outPort.signal[1] := Max_Output_Pos;
elseif pout < Max_Output_Neg then
outPort.signal[1] := Max_Output_Neg;
else
outPort.signal[1] := pout;
end if; end Controller; block CommandSignalGenerator OutPort outPort(n=1);
Real acc; equation if time <= 1 then
acc =60;
elseif time <3 then
acc = 0;
elseif time <4 then
acc = -60;
else
acc = 0;
end if; der(outPort.signal[1]) = acc; end CommandSignalGenerator;

基于上述元件模型,给出一个直流调速系统实例:

model DCMotorControlSystem

  Ground       ground1;
Inertia inertia1(J = 3, w(fixed = true));
DCMotor motor1(J = 1,R = 0.6,L = 0.01,Kt=1.8, Ke= 1.8,rotFlange_b(phi(fixed = true)));
CommandSignalGenerator sg1;
Controller con1;
PWMVoltageSource PowerSource1;
equation
connect(sg1.outPort, con1.command);
connect(con1.feedback, motor1.SensorVelocity);
connect(con1.outPort, PowerSource1.Command);
connect(PowerSource1.p, motor1.p);
connect(motor1.rotFlange_b, inertia1.rotFlange_a);
connect(PowerSource1.n, ground1.p);
connect(ground1.p, motor1.n);
end DCMotorControlSystem;

模型检查通过后,就可以运行仿真命令并观察各个标量的波形。

simulate( DCMotorControlSystem, stopTime=5 )

直流调速系统Modelica基本模型的更多相关文章

  1. PLECS_晶闸管调速系统_9w

    3. 直流电机开环调压调速系统模型搭建 (1)电路图 (2)仿真 当 α = pi / 2.7 的时候,直流电机的稳定转速大约保持很低的速度. 随着α的减少,直流电机的速度逐渐增大.当α = pi / ...

  2. [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题

    问题描述:由单片机的VCC引脚供电,使用L298N控制两个电机,发现左右两个轮子的转速老是不一样,更多的情况是左轮转速高(左轮电机接OUT1和OUT2),右轮转速低(右轮电机接OUT3和OUT4)甚至 ...

  3. 直流电机PWM调速系统中控制电压非线性研究_控制元件_工业自动化控制_文章

    直流电机PWM调速系统中控制电压非线性研究_控制元件_工业自动化控制_文章_e-works数字化企业网 http://articles.e-works.net.cn/Component/Article ...

  4. 玩转X-CTR100 l STM32F4 l TB6612直流电机调速控制

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器的直流调速电机控制,X ...

  5. 通过PROFINET网络实现SINAMICS 120的PN IO OPC通讯,起动及调速控制 | OPC通讯

    1 概述 TCP/IP 通讯的传输时间可能太长,并且该时间具有不确定性,无法满足生产自动化领域的要求.因此,在进行时间要求苛刻的IO 有效载荷数据通讯时,PROFINET IO 不使用TCP/IP,而 ...

  6. 面向个性化需求的在线云数据库混合调优系统 | SIGMOD 2022入选论文解读

    SIGMOD 数据管理国际会议是数据库领域具有最高学术地位的国际性会议,位列数据库方向顶级会议之首.近日,腾讯云数据库团队的最新研究成果入选 SIGMOD 2022 Research Full Pap ...

  7. 权限系统与RBAC模型概述

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3793894.html ...

  8. 过渡与动画 - steps调速函数&CSS值与单位之ch

    写在前面 上一篇中我们熟悉五种内置的缓动曲线和(三次)贝塞尔曲线,并且基于此完成了缓动效果. 但是如果我们想要实现逐帧动画,基于贝塞尔曲线的调速函数就显得有些无能为力了,因为我们并不需要帧与帧之间的过 ...

  9. 权限系统与RBAC模型概述[绝对经典]

    0. 前言 一年前,我负责的一个项目中需要权限管理.当时凭着自己的逻辑设计出了一套权限管理模型,基本原理与RBAC非常相似,只是过于简陋.当时google了一些权限管理的资料,从中了解到早就有了RBA ...

随机推荐

  1. ASP.NET MVC Bootstrap极速开发框架

    前言 每次新开发项目都要从头开始设计?有木有一个通用的快速开发框架?并且得是ASP.NET MVC  And Bootstrap?数据库不要手工创建?框架对未来业务支持的扩展性好?这么简单的功能还需要 ...

  2. JavaScript(五)——插入地图

    代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...

  3. oracle DB_LINK

    1.先创建远程数据库服务名(注意,如果服务器既有oracle服务端又有客户端,需要在服务端的tnsnames.ora中配置服务名,否则会报如下错误): SQL> select count(*) ...

  4. Java设计模式学习笔记(单例模式)

    最近一直在看<Head First设计模式>,这本书写的确实是很不错的,专注于怎么用最简单的方式最通俗的语言让人了解设计模式.据说GoF的设计模式那本书写的很好,是一本经典,但是就是难懂, ...

  5. 烂泥:rsync配置文件详解

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 对于rsync服务器来说,最重要和复杂的就是它的配置了.rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证.访问.日志记录等等. ...

  6. Makefile内嵌函数

    subst字符串替换函数 $(subst <from>, <to>, <text>),把<text>中的<from>字符串替换成<to ...

  7. System.getProperty()引起的悲剧--您的主机中的软件中止了一个已建立的连接

    我已无法形容此刻我的心情.. 本来是已经写好的netty5的demo程序,server和client之间创建tcp长连接的..然后随便传点数据的简单demo..然后今天试了一下tcp粘包的例子,用到了 ...

  8. [转]Oracle Form 触发器执行顺序

    Trigger 不是数据库中的触发器,不过功能类似,都是当某个事件发生的时候会触发. Trigger中可以编写代码,当对应事件发生的时候就会执行该Trigger中的代码. Oracle Form中的T ...

  9. 06章 Struts2国际化

    1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素.换言之,应用程序的功 ...

  10. AC日记——字符串判等 openjudge 1.7 17

    17:字符串判等 总时间限制:  1000ms 内存限制:   65536kB 描述 判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等. 输入 两行,每行包含一个字符串. 输出 ...