`
chpn
  • 浏览: 8908 次
  • 来自: ...
社区版块
存档分类
最新评论

使用动态代理实现精简版CachedRowSetImpl

阅读更多
曾经,为了避免“Access restriction” ,打算自动实现一个CachedRowSet  ,于是新建一个类implements CachedRowSet , 没有做其它任何工作,代码已经2千多行了, class文件38K !!!
所以多次因此放弃了。

今天想到用动态代理实现CachedRowSet ,于是只实现其中部分有用的方法,剩余的300多个无用方法不处理。几百行代码就解决问题 ,并且
   支持修改结果集内容,增加结果集的列,
   getXXX( ) 不会字字段不存在出现讨厌的SQLException
   不会因字段使用了别名出现字段不存在的问题

调用方式

ResultSet rs = statement.executeQuery(sql);
CachedRowSet rowSet = SimpleCachedRowSetImpl.newInstance();
rowSet.populate( rs );

ProxyHandler
public    class ProxyHandler implements InvocationHandler {
	private Object concreteClass;

	public ProxyHandler(Object concreteClass) {
		this.concreteClass = concreteClass;
	}

	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
		try{
			method = concreteClass.getClass().getMethod(method.getName(), method.getParameterTypes() );
			Object object = method.invoke(concreteClass, args);// 普通的Java反射代码,通过反射执行某个类的某方法
			return object;
		}catch(NoSuchMethodException ex){
			if( method.getName().startsWith("set")){
				throw new NoSuchMethodException( ex.getMessage() +", 请使用setObject");
			}
			throw ex;
		}catch( InvocationTargetException ex){
			//抛出原始的错误避免过多的stacktrace
			throw ex.getCause();
		}
	}

}


SimpleCachedRowSetImpl
public class SimpleCachedRowSetImpl implements SimpleRowSet  {
	LinkedList<Object[]> data = new LinkedList<Object[]>();
	TreeMap<String,Integer > fieldNameMap = new TreeMap<String,Integer >( String.CASE_INSENSITIVE_ORDER );
	private static final int FETCHCOUNT = 2000; 
	private int cursor =-1;
	private int rowCount =0;
	private int pageSize = 0;
	private int columnCount =0;
	private ResultSetMetaData meta; 
	private SimpleCachedRowSetImpl(){}
	/**
	 * 创建一个 CachedRowSet 实例
	 * @return
	 */
	public static CachedRowSet newInstance() {
		SimpleCachedRowSetImpl rowset = new SimpleCachedRowSetImpl() ;
		InvocationHandler ih = new ProxyHandler( rowset );
		Class<?>[] interfaces = {CachedRowSet.class,SimpleRowSet.class};
		Object newProxyInstance = Proxy.newProxyInstance( SimpleCachedRowSetImpl.class.getClassLoader()  , interfaces, ih);
	
		return (CachedRowSet)newProxyInstance;
	}
	private void updateMeta(ResultSet rs) throws SQLException{
		ResultSetMetaData oldmeta = rs.getMetaData();
		ResultSetMeta meta = new ResultSetMeta(oldmeta);
		
		columnCount = oldmeta.getColumnCount();
		for(int i=1;i<=columnCount;i++){
			Field field = new Field();
			field.catalogName = oldmeta.getCatalogName( i );
			field.columnClassName = oldmeta.getColumnClassName( i );
			field.columnType = oldmeta.getColumnType( i );
			field.columnLabel = oldmeta.getColumnLabel( i );
			field.columnName = oldmeta.getColumnName( i );
			field.precision  = oldmeta.getPrecision( i );
			field.scale  = oldmeta.getScale( i );
			field.schemaName = oldmeta.getSchemaName( i );
			field.table = oldmeta.getTableName( i );
			meta.addField(field);
		}
		this.meta = meta;
		
	}
	public void populate(ResultSet rs, int start) throws SQLException {
		if( start>-1){
			rs.absolute(start);
			rs.setFetchSize( this.pageSize );
		}else{

			rs.setFetchSize( FETCHCOUNT );
		}
		updateMeta(rs);
		rowCount = 0;
		while(rs.next()){
			Object[] row = new Object[ columnCount ];
			for(int i=1;i<=columnCount ;i++ ){
				row[ i-1 ] = rs.getObject( i );
			}
			data.add( row );
			rowCount++;
			if(start>-1 &&  rowCount> pageSize)
				break;
		} 
		//设置字段序号
		for(int i=1;i<=columnCount;i++){
			String fieldName = meta.getColumnLabel( i ); //使用 as 中的名称
			fieldNameMap.put( fieldName , i -1  ); //从0开始 
		}
		rowCount = data.size();

	}

	public void populate(ResultSet rs ) throws SQLException {
		populate( rs , -1 ); 
	} 
	@Override
	public boolean next() throws SQLException{
		if( cursor<rowCount-1){
			cursor++;
			return true;
		}
		cursor = rowCount;
		return false;
	}
	@Override
	public void beforeFirst() throws SQLException{
		cursor=-1;
	}
	@Override
	public String getString(String key ) throws SQLException{
		Object value = getObject( key );
		if( value==null)
			return null;
		return value.toString();
	}
	@Override
	public String getString(int index ) throws SQLException{
		Object value = getObject( index );
		if( value==null)
			return null;
		return value.toString();
	}
	@Override
	public Object getObject(String key ) throws SQLException{
		int index = getIndex(key); 
		return getObject(index );
	}
	@Override
	public Object getObject(int index ) throws SQLException{
		if( index==-1)
			return null;
		if( index<1 || index> columnCount ){
			throw new SQLException("必须是1-"+columnCount + "之间的数字" );
		} 
		Object[] row = data.get( cursor );
		Object value = row[ index -1  ];
		return value;
	}
 
	

	@Override
	public int getInt(int index) throws SQLException {
		Object value = getObject(index);
		if(value==null)
			return 0 ;
		if( value instanceof Number ){
			return ((Number)value).intValue();
		}
		if( value instanceof BigDecimal ){
			return ((BigDecimal)value).intValue();
		}
		String svalue = value.toString();
		try{
			return Integer.parseInt( svalue );
		}catch(NumberFormatException ex){
			throw new SQLException(svalue+"无法转换为int类型");
		}
		
	}

	@Override
	public int getInt(String key) throws SQLException {
		int index = getIndex(key); 
		return getInt( index );
		
	}

	@Override
	public long getLong(int index ) throws SQLException {
		Object value = getObject(index);
		if(value==null)
			return 0 ;
		if( value instanceof Number ){
			return ((Number)value).longValue();
		}
		if( value instanceof BigDecimal ){
			return ((BigDecimal)value).longValue();
		}
		String svalue = value.toString();
		try{
			return Long.parseLong( svalue );
		}catch(NumberFormatException ex){
			throw new SQLException(svalue+"无法转换为long类型");
		}
		
	}

	@Override
	public long getLong(String key) throws SQLException {
		int index = getIndex( key ); 
		return getLong( index );
		
	}
	
	

	@Override
	public float getFloat(String key) throws SQLException {
		int index = getIndex( key ); 
		return getFloat( index );
	}

	@Override
	public float getFloat(int index) throws SQLException {
		Object value = getObject(index);
		if(value==null)
			return 0 ;
		if( value instanceof Number ){
			return ((Number)value).floatValue();
		}
		if( value instanceof BigDecimal ){
			return ((BigDecimal)value).floatValue();
		}
		String svalue = value.toString();
		try{
			return Float.parseFloat( svalue );
		}catch(NumberFormatException ex){
			throw new SQLException(svalue+"无法转换为float类型");
		}
		
	}

	@Override
	public BigDecimal getBigDecimal(int index) throws SQLException {
		Object value = getObject(index);
		if(value==null)
			return null ;
		return ((BigDecimal)value) ;
		
	}

	@Override
	public BigDecimal getBigDecimal(String key) throws SQLException {
		int index = getIndex( key ); 
		return getBigDecimal( index );
		
	}

	@Override
	public double getDouble(int index) throws SQLException {
		Object value = getObject(index);
		if(value==null)
			return 0 ;
		if( value instanceof Number ){
			return ((Number)value).doubleValue();
		}
		if( value instanceof BigDecimal ){
			return ((BigDecimal)value).doubleValue();
		}
		String svalue = value.toString();
		try{
			return Double.parseDouble( svalue );
		}catch(NumberFormatException ex){
			throw new SQLException(svalue+"无法转换为double类型");
		}
		
	}

	@Override
	public double getDouble(String key) throws SQLException {
		int index = getIndex( key ); 
		return getDouble( index );
		
	}
//	@Override
//	public Date getDate(String key) throws SQLException {
//		int index = getIndex( key ); 
//		return getDate( index );
//		
//	}
	private int getIndex(String key){
		Integer index = fieldNameMap.get(key); 
		if( index==null)
			return  -1;
		return index +1;
	}
//	@Override
//	public Date getDate(int index) throws SQLException {
//
//		Object value = getObject(index );
//		if(value==null)
//			return null ;
//		if( value instanceof Date ){
//			return ((Date)value);
//		}
//		throw new NotImplementedException();
//		
//	}
//
//	@Override
//	public Date getDate(int index, Calendar calendar) throws SQLException {
//		throw new NotImplementedException();
//		
//	}
//
//	@Override
//	public Date getDate(String fieldName, Calendar calendar) throws SQLException {
//		throw new NotImplementedException();
//		
//	}
//
//	@Override
//	public Time getTime(int index) throws SQLException {
//		throw new NotImplementedException();
//		
//	}
//
//	@Override
//	public Time getTime(String fieldName) throws SQLException {
//		throw new NotImplementedException();
//		
//	}
//
//	@Override
//	public Time getTime(int index, Calendar calendar) throws SQLException {
//		throw new NotImplementedException();
//		
//	}
//
//	@Override
//	public Time getTime(String fieldName, Calendar calendar) throws SQLException {
//		throw new NotImplementedException();
//		
//	}

	@Override
	public Timestamp getTimestamp(int index) throws SQLException {

		Object value = getObject(index );
		int type = meta.getColumnType( index );
		if( type== Types.TIMESTAMP ){
			return ((Timestamp)value);
		}
		throw new NotImplementedException();
		
	}

	@Override
	public Timestamp getTimestamp(String fieldName) throws SQLException {
		return getTimestamp( getIndex( fieldName ));
		
	}

//	@Override
//	public Timestamp getTimestamp(int index, Calendar calendar) throws SQLException {
//
//		throw new NotImplementedException();
//		
//	}
//
//	@Override
//	public Timestamp getTimestamp(String fieldName, Calendar calendar) throws SQLException {
//		throw new NotImplementedException();
//		
//	}
//	@Override
//	public Blob getBlob(String fieldName) throws SQLException {
//		throw new NotImplementedException();
//		
//	}

	@Override
	public boolean getBoolean(int index) throws SQLException {
		Object val = getObject(index);
		return new Integer(1).equals(val);
		
	}

	@Override
	public boolean getBoolean(String key) throws SQLException {
		Object val = getObject( key );
		return new Integer(1).equals(val);
		
	}

	@Override
	public byte getByte(int index) throws SQLException {
		Object val = getObject( index );
		if( val==null)
			return 0;
		return (Byte)val;
		
	}

	@Override
	public byte getByte(String key) throws SQLException {
		Object val = getObject( key );
		if( val==null)
			return 0;
		return (Byte)val;
		
	}

//	@Override
//	public byte[] getBytes(int index) throws SQLException {
//		Object val = getObject( index );
//		if( val==null)
//			return null;
//		return (byte[])val;
//		
//	}
//
//	@Override
//	public byte[] getBytes(String fieldName) throws SQLException {
//		return getBytes( getIndex(fieldName));
//		
//	}
	
	public void setPageSize( int pageSize ) throws SQLException{
		this.pageSize = pageSize;
	}
 

	@Override
	public ResultSetMetaData getMetaData() throws SQLException {
		return meta;
		
	}
	@Override
	public void setObject(int colIndex, Object value) throws SQLException  {
		if( colIndex<1){
			throw new SQLException("应从1开始");
		}
		Object[] row = getCurrentRow();
		if( colIndex>row.length){
			row =Arrays.copyOf( row ,  colIndex );
			data.add( cursor , row );
		}
		row[ colIndex -1 ] = value;
	} 
	private Object[] getCurrentRow() { 
		return data.get( cursor );
	}
	@Override
	public void setObject(String field, Object value) throws SQLException  {
		int index = getIndex( field );
		if( index==-1){
			addColumn( field );
			index = getIndex( field );
		}
		//Object[] row = getCurrentRow();
		setObject( index , value );
		
	}
	private void addColumn(String field) {
		fieldNameMap.put( field , fieldNameMap.size() );
		columnCount = fieldNameMap.size();
		
	}
	


}


余下程序见附件
分享到:
评论

相关推荐

    基于S7-200 PLC与MCGS组态的洗衣机控制系统设计与实现

    内容概要:本文详细介绍了利用西门子S7-200 PLC和MCGS组态软件构建洗衣机控制系统的全过程。首先阐述了IO分配规则,明确各输入输出点的功能,如水位检测、温度测量、电机控制等。接着展示了梯形图编程的具体方法,解释了如何通过梯形图实现洗衣机的基本操作流程,包括启动、停止、水位控制、正反转洗涤、排水和脱水等功能。此外,文中还讨论了接线图的设计要点,强调了硬件连接的安全性和可靠性。最后,介绍了MCGS组态画面的设计,包括动态效果展示、报警机制以及人机交互界面的优化。 适合人群:对PLC编程和工业自动化感兴趣的工程师和技术人员,尤其是希望深入了解S7-200 PLC和MCGS组态软件的实际应用者。 使用场景及目标:适用于需要设计和实施小型家电或类似设备自动化控制系统的场合。目标是帮助读者掌握PLC编程技巧,理解工业自动化控制系统的构建过程,提高实际项目开发能力。 其他说明:文中提供了丰富的调试经验和常见问题解决方案,有助于读者在实践中少走弯路。同时,通过具体的案例分析,使理论知识更加贴近实际应用。

    COMSOL中基于保角变换的自聚焦光束与Talbot效应的光学仿真研究

    内容概要:本文详细介绍了如何利用COMSOL进行光学仿真,重点探讨了保角变换在操控光路方面的应用,特别是自聚焦光束和Talbot效应的建模。文中首先解释了保角变换的基本概念及其物理意义,然后通过具体实例展示了如何在COMSOL中设置保角变换、定义材料参数以及配置边界条件。对于自聚焦光束,作者强调了非线性材料模块的应用,特别是在处理强光引起的折射率变化时的关键步骤。而对于Talbot效应,则着重讨论了周期性边界条件的设置和后处理分析方法。此外,文章还分享了一些实用技巧,如参数化扫描、网格优化和MATLAB联动分析等。 适合人群:具有一定光学仿真基础的研究人员和技术人员,尤其是对COMSOL软件有一定了解并希望深入探索非线性光学现象的用户。 使用场景及目标:① 使用COMSOL进行自聚焦光束和Talbot效应的建模与仿真;② 掌握保角变换在光学仿真中的应用技巧;③ 提升对非线性光学现象的理解和仿真能力。 其他说明:本文不仅提供了详细的建模指导,还包括了许多实用的调试技巧和注意事项,帮助读者更好地理解和应用相关技术。

    产品PRD需求文档模板

    产品PRD需求文档模板

    COMSOL模拟针尖刺穿表皮细胞:探究电穿孔技术中的电场与物质传输机制

    内容概要:本文详细介绍了使用COMSOL软件进行针尖刺穿表皮细胞的数值模拟,探讨了电穿孔技术中电场分布与物质传输的关系。首先,通过参数化建模构建了圆锥形针尖和细胞结构,确保针尖能够有效穿透细胞膜。然后,设置了多物理场耦合,包括电流传导和稀物质传递,使电场和浓度场相互作用。文中特别强调了细胞膜的薄层边界条件和电场增强扩散系数的设定,以及如何通过边界条件模拟电穿孔过程。此外,还讨论了求解器配置、网格划分和结果后处理方法,展示了电场流线和浓度云图的可视化结果。最终,验证了模型的可靠性,并提出了进一步的研究方向,如加入温度场和针尖振动参数。 适合人群:从事生物医学工程、电穿孔技术和药物递送系统研究的专业人士,尤其是有一定COMSOL使用经验和数值模拟基础的研究人员。 使用场景及目标:适用于希望深入了解电穿孔技术中电场与物质传输机制的研究人员,帮助他们优化微针给药系统的参数设计,提高药物递送效率。 其他说明:本文提供了详细的建模步骤和技术细节,有助于读者快速掌握COMSOL在生物电穿孔领域的应用。同时,文中提到的一些技巧和注意事项可以避免常见的数值模拟错误,提高模拟精度。

    MATLAB实现冷热电气多能互补微能源网的鲁棒优化调度模型

    内容概要:本文详细探讨了基于MATLAB的冷热电气多能互补微能源网的鲁棒优化调度模型。首先介绍了多能耦合元件(如风电、光伏、P2G、燃气轮机等)的运行特性模型,展示了如何通过MATLAB代码模拟这些元件的实际运行情况。接着阐述了电、热、冷、气四者的稳态能流模型及其相互关系,特别是热电联产过程中能量的转化和分配。核心部分在于构建了考虑经济成本和碳排放的优化调度模型,利用MATLAB优化工具箱求解多目标优化问题,确保系统在经济性和环保性之间达到最佳平衡。此外,文中还讨论了处理风光出力预测误差的方法,采用了鲁棒优化策略应对不确定性,并通过实例验证了模型的有效性。 适合人群:从事能源系统研究、优化调度领域的科研人员和技术开发者,尤其是熟悉MATLAB编程并关注低碳发展的专业人士。 使用场景及目标:适用于希望深入了解综合能源系统优化调度机制的研究者,旨在帮助他们掌握如何在MATLAB环境下构建和求解复杂的多能互补优化调度模型,以实现节能减排和经济效益的最大化。 其他说明:文章不仅提供了详细的理论推导和代码实现,还分享了许多实践经验,如非线性约束处理、多能流耦合约束的建模技巧等,对于实际工程应用具有重要指导意义。

    STM32 Nucleo-64 开发板用户手册

    STM32 Nucleo-64 开发板用户手册

    chromedriver-mac-x64-136.0.7098.0(Canary).zip

    chromedriver-mac-x64-136.0.7098.0(Canary).zip

    综合能源系统中电、热、冷、气的分时电价与储能优化调度

    内容概要:本文详细探讨了综合能源系统中电、热、冷、气四种能源形式的优化调度方法,重点介绍了分时电价机制下的储能装置调度策略。通过Python代码实例展示了如何利用线性规划工具(如PuLP库)构建优化模型,实现储能装置的高效充放电管理以及多能流耦合设备的协调运作。文中不仅讨论了储能装置的充放电效率、初始电量设置等关键技术细节,还涉及了热泵、燃气锅炉、吸收式制冷机等多种设备之间的能量转换关系及其优化配置。 适合人群:从事综合能源系统研究的技术人员、能源管理系统开发者、工业自动化领域的工程师。 使用场景及目标:适用于需要降低综合能源系统运行成本的企业或机构,尤其是那些面临复杂电价政策和技术挑战的场景。目标是通过合理的调度策略,在满足各类能源需求的前提下,最大限度地减少运营成本,提高经济效益。 其他说明:文章强调了分时电价对储能调度的影响,并指出储能装置在削峰填谷方面的重要作用。此外,还提到了多时间尺度优化、设备启停成本等因素对整体优化效果的影响。

    计算机暑假实践报告.pdf

    计算机暑假实践报告.pdf

    地铁线路最短路径规划1.1版本

    帮助用户规划地铁出行路线

    光伏并网系统中虚拟同步发电机(VSG)技术的Simulink仿真与实现

    内容概要:本文详细介绍了如何在Simulink中构建和优化光伏并网系统的虚拟同步发电机(VSG)模型。首先解释了VSG的核心控制方程及其参数调节方法,强调了转动惯量(J)和阻尼系数(D)对系统稳定性的影响。接着探讨了逆变器控制部分采用的双闭环结构以及锁相环(PLL)配置,并分享了光照条件模块的设计思路。此外,还提到了谐波分析、超级电容储能模型的应用以及关键性能指标的验证方法。最后,通过对比有无VSG时的频率曲线,展示了VSG在稳定电网方面的显著效果。 适合人群:从事新能源并网研究的技术人员、电力系统工程师、高校相关专业师生。 使用场景及目标:适用于希望深入了解光伏并网系统中VSG技术原理及其实现方法的研究者和技术开发者。目标是在Simulink环境中搭建高效稳定的VSG模型,提高光伏系统的并网友好性。 其他说明:文中提供了大量实用的MATLAB/Simulink代码片段和调试技巧,帮助读者更好地理解和应用VSG技术。同时,针对可能出现的问题给出了具体的解决方案,确保模型能够顺利运行并达到预期效果。

    电力系统光伏并网概率潮流计算:MATLAB实现蒙特卡洛与半不变量法

    内容概要:本文详细介绍了如何使用MATLAB进行光伏并网后的概率潮流计算,针对光伏出力的不确定性,提出了两种主要方法:蒙特卡洛模拟和半不变量法。蒙特卡洛方法通过生成大量光伏出力场景并逐一进行潮流计算,最终统计电压分布;而半不变量法则通过对光伏出力的统计特征进行级数展开,快速计算电压的概率分布。文中还提供了具体的MATLAB代码示例,展示了如何用Beta分布建模光伏出力,并通过IEEE34节点系统进行了实例演示。此外,文章还探讨了两种方法的优劣及其应用场景,强调了Beta分布参数选择的重要性以及雅可比矩阵在线性化过程中可能出现的问题。 适合人群:从事电力系统研究和工程应用的技术人员,特别是那些对光伏并网和概率潮流计算感兴趣的读者。 使用场景及目标:适用于需要评估光伏并网对电网稳定性影响的研究人员和技术人员。具体目标包括:①掌握光伏出力不确定性的建模方法;②理解蒙特卡洛模拟和半不变量法的工作原理及其适用范围;③能够独立完成基于MATLAB的概率潮流计算。 其他说明:文章不仅提供了详细的代码实现,还给出了相关参考文献,帮助读者深入理解背后的数学原理和技术背景。同时,作者提醒了一些常见的陷阱和注意事项,确保读者能够在实践中少走弯路。

    基于MATLAB的水箱水位模糊控制系统设计与实现

    内容概要:本文介绍了利用MATLAB设计和实现单容水箱水位模糊控制系统的全过程。首先建立了水箱系统的非线性微分方程模型,解决了传统PID控制器在非线性环节容易震荡的问题。接着通过FIS Editor构建模糊推理系统,定义输入输出变量及其隶属度函数,并设置简单的模糊规则来控制水位。仿真结果显示,模糊控制相比PID控制具有更低的超调量和平滑的控制效果。此外,文中还分享了一些调试技巧和优化方法,如调整隶属度函数的重叠区域和规则权重,以及如何应对系统抗干扰性和稳定性问题。 适合人群:控制工程专业的学生、研究人员以及对模糊控制感兴趣的工程师。 使用场景及目标:适用于需要精确控制水位的工业自动化场合,特别是那些存在非线性因素的系统。目标是通过模糊控制提高系统的响应速度和稳定性,减少超调量。 其他说明:提供了完整的工程文件和详细的调试笔记,方便读者复现实验结果。同时强调了模糊控制在处理复杂非线性系统方面的优势,展示了其灵活性和实用性。

    西门子Smart200与V90伺服三轴联动控制系统的实现及调试技巧

    内容概要:本文详细介绍了西门子Smart200 PLC与V90伺服在中小型自动化设备中的三轴联动控制方案。主要内容涵盖PLC程序的核心代码解析,包括轴配置、点动功能、绝对定位指令等;HMI界面设计,如触摸屏变量绑定和交互设计;电气原理图的关键点,如抱闸控制和电源分配;以及调试经验和故障排除方法。文中还强调了详细的注释和文档管理对于后期维护的重要性。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对西门子Smart200和V90伺服系统有一定了解并希望深入掌握其应用的人群。 使用场景及目标:适用于中小型自动化设备的设计、安装和调试,帮助工程师快速理解和实施三轴联动控制方案,提高设备的稳定性和精度。 其他说明:文中提供了多个实际案例和调试技巧,有助于避免常见错误,提升项目的成功率。此外,还分享了一些实用的经验和最佳实践,如合理的IO表设计和详细的程序注释。

    强化学习、单Agent和多Agent强化学习算法的实现 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    微电网并离网下垂控制Simulink模型解析及其应用

    内容概要:本文详细介绍了微电网并离网下垂控制的Simulink模型,涵盖虚拟同步机、模式切换逻辑和负载扰动测试三大核心模块。通过具体代码片段展示了下垂控制的关键算法,如频率和电压下垂特性、模式切换条件判断以及PI参数配置。文中还分享了多个调试技巧,如仿真步长设置、参数优化方法和常见问题解决办法。此外,模型中加入了预同步模块和负荷电流前馈补偿,确保了并网/离网切换时的平稳性和快速响应。 适合人群:对微电网控制技术和Simulink建模有一定基础的研究人员和技术人员。 使用场景及目标:适用于研究和开发微电网控制系统,特别是关注并网和离网模式之间的无缝切换及频率电压自主调节的应用场景。目标是帮助读者理解和掌握下垂控制的具体实现方法,提高系统的稳定性和响应速度。 其他说明:模型文件建议使用Matlab R2018b及以上版本打开,仿真步长设定为50μs到100μs之间,以获得最佳效果。文中提到的多个参数和配置均经过大量仿真实验验证,提供了宝贵的实践经验。

    基于PLC的药片自动装瓶机控制系统设计与应用

    内容概要:本文详细介绍了基于PLC(可编程逻辑控制器)的药片自动装瓶机控制系统的设计与实现。首先概述了整体控制逻辑,包括药片计数、传送、瓶子供应、定位、装瓶和封盖等步骤的精确配合。接着讨论了PLC选型与I/O分配,重点展示了如何利用光电传感器、电机和其他组件实现各个功能。文中还探讨了故障检测与处理方法,如电机过载保护,并分享了一些调试技巧和优化经验,如振动盘出口光电传感器的角度调整、伺服定位模块的参数优化等。此外,文章提到了人机界面的设计,强调了操作简便性和报警记录功能的重要性。 适合人群:从事自动化控制、制药行业的工程师和技术人员,尤其是对PLC编程和机械设备有兴趣的专业人士。 使用场景及目标:适用于药片自动装瓶机的设计、调试和维护过程中,帮助提高生产效率和产品质量,减少故障发生率,确保系统的稳定性和可靠性。 其他说明:文中不仅提供了具体的编程实例,还分享了许多实践经验,有助于读者更好地理解和应用相关技术和方法。

    2024年第一季度成都房地产市场回顾与展望.pdf

    2024年第一季度成都房地产市场回顾与展望

    计算机十分计算题.pdf

    计算机十分计算题.pdf

Global site tag (gtag.js) - Google Analytics